32位arm的写存操作,没有内存对齐的赋值

用32位arm7芯片lpc2129和keil编译器,在项目开发中遇到的问题如下:

定义字节数组 :

BYTE array[10] = {0};

然后把地址&array[1]强制转换并赋值:

*(UINT16 *)(&array[1]) = 0xaabb;

然后读取数组里的内容,发现被赋值的元素是array[0]和array[1],读出的内容是:

array[0]的内容是0xbb, array[1]的内容是0xaa,array[2]-array[9]都是0。

甚是不解。难道被赋值的不应该是array[1]和array[2]吗?

于是我把这几行代码用vs2008在pc上运行一下,发现,被赋值的是array[1]和array[2](这是我预期的)。

紧接着我又在arm + keil里试了一下,给&array[2]强制转换并赋值,发现是我预期的,被赋值的是array[2]和array[3].

思考:

1 ,这个应该不是大小端的问题。

2,如果是内存强制对齐的问题,32 位 cpu访问内存的时候只能访问4的整数倍的地址,但是keil编译器应该会把该语句编为多次store(写存)命令,然后运算出一个对应的值放到对应的地址啊。

我明天看下对应的汇编代码。明天见。

时间: 2024-08-15 20:51:23

32位arm的写存操作,没有内存对齐的赋值的相关文章

JavaScript 32位整型无符号操作

在 JavaScript 中,所有整数字变量默认都是有符号整数,这意味着什么呢? 有符号整数使用 31 位表示整数的数值,用第 32 位表示整数的符号,0 表示正数,1 表示负数. 数值范围从 -2^31 - 2^31-1 即 -2147483648 到 2147483647. JavaScript 进行位操作时,是采用32位 有符号 整型,这意味着其转换的结果也是32位有符号整型. 有些时候,我们进行移位会出现意想不到的结果,以下是C语言 与 JS 的对比. C语言 1 unsigned in

让32位linux/Centos系统支持4G以上内存

让32位的Centos系统支持4G以上内存,刚开始的时候有人说用64位的系统不都解决了吗?其实32位系统和64位系统各有各的用处.下面使用Centos-5.5-32位演示 一.系统环境: VMware虚拟机 系统:Centos-5.5  32位 内存:4G 32位系统没有破除限制,系统只能识别都3G的内存 # free -m # uname -a  //原始内核 Linux localhost 2.6.18-194.el5 #1 SMP Fri Apr 2 14:58:35 EDT 2010 i

为什么32位机器最大只能用到4GB内存

在此之前先来了解一些计算机存储单位之间的关系以及计算机系统结构和PC硬件方面的一些知识. 一.计算机存储单位之间的关系 位 bit (Binary Digits):存放一位二进制数,即 0 或 1,最小的存储单位. 字节 byte:8个二进制位为一个字节(B),即1B = 8bit,最常用的单位. 计算机存储单位一般用B,KB,MB,GB,TB,PB,EB,ZB,YB,BB来表示,它们之间的关系是: 1KB (Kilobyte?) ? ? ??=2^12B?=1024B 1MB (Megabyt

32位和64位下结构体内存对齐问题

1.先看64位下: #include<stdio.h> struct A { int a; char b; double c; char d; }; struct B { char a; double b; char c; }; int main() { printf("int =%lu,char=%lu,double=%lu\n",sizeof(int),sizeof(char),sizeof(double)); printf("structA=%lu stru

32位Windows7上8G内存使用感受+xp 32位下使用8G内存 (转)

32位Windows7上8G内存使用感受+xp 32位下使用8G内存 博客分类: Windows XPWindowsIE企业应用软件测试 我推荐做开发的朋友:赶快加入8G的行列吧....呵呵..超爽...速度超快...基本没有等待的概念...深有体会... 为什么要使用8G内存?在国内外各大论坛上,这都是一个有争议的问题.问题的反方论据非常充分: 除了少数专业领域,大多数应用程序不会需要超过1G的内存. 游戏使用的内存最多也是2G而已. 8G内存不便宜,不如花在显卡上. 升级到8G后没有什么明显

微软的操作系统中让 32 位支持大于 4GB 的内存。

先给一个参考文献:The RAM reported by the System Properties dialog box and the System Information tool is less than you expect in Windows Vista or in Windows XP Service Pack 2 or later version 先说结论: 1.PAE允许操作系统在32位模式下使用大于4G的物理内存. 2.不管是否使用PAE,对于单个进程而言,32位系统下可见

C#位运算实际作用之操作整型某一位

1.前言 前几天写了两篇关于c#位运算的文章 c#位运算基本概念与计算过程 C#位运算实际运用 在文中也提到了位运算的实际作用之一就是合并整型,当时引用了一个问题: C# 用两个short,一个int32拼成一个long型,高16位用short,中间32位用int,最低16位用另外一个short. 答案如下: 高16位shortA.中间32位intA.低16位shortB longResult=((long)shortA << 48 )+ ((long)intA << 16)+ s

关于32位程序的内存

在上大学的时候老师提到过这么一个知识点 32位程序的寻址能力是2^32,也就是4G.对于32位程序只能申请到4G的内存.而且这4G内存中,在windows下有2G,linux下有1G是保留给内核态使用,用户态无法访问.故只能分配2G.3G的内存使用. 前几天服务器报警了,无法负载更多的用户进行访问.赶紧看了下程序的自我评分,显示内存占用达到3.6G,无法继续工作. WTF?3.6G?超过linux下32位程序只能使用3G内存的限制? 这个时候怀疑是评分程序写错了,赶紧用TOP看了下内存,也达到了

转 警惕“32位Win7装4G内存”的谬论

随着电脑升级换代的加速4GB内存已经成为主流,但是由于缺乏计算机基础知识很多人在安装系统的时候选择了32位Win7装4G内存,其结果是4GB内存不能完全识别,通常显示为3GB或者3.5GB之类.于是很多人使用了一款叫做Ready for 4GB的软件.该软件号称可以破解windows PAE文件来突破内存极限,却不知如此使用将系统推上了不稳定的边缘. 为何32位Win7不可识别4G内存 32位系统不能直接识别4GB以上内存的限制不是简单的在windows PAE上,而是在32位这个大逻辑基础上的