ARM汇编指令str,ldr引用地址不为4个字节整数倍出现的问题
1.无问题代码
area test, code, readonly
code32
entry ;汇编头定义
start
mov r0, #0x00000000fe ;将0xfe存入寄存器r0
ldr r1, =0x40000000 ; 将0x40000000地址存r1
str r0, [r1] ; 将0xfe(存于r0)写入0x40000000地址空间
ldr r2, [r1] ;将0x40000000地址的值读到r2
nop
nop
end
- 问题
情况 | 结果 |
---|---|
当r1存入的地址值为0x40000000+1时 | r2读出的的值为0xfe00000000 |
当r1存入的地址值为0x40000000+2时 | r2读出的的值为0x00fe000000 |
当r1存入的地址值为0x40000000+3时 | r2读出的的值为0x000000fe00 |
-
原因
a.指令str:无论存入地址为多少都是以4个字节为单位存入,也就是说无论存入地址是0x40000000或0x40000001或0x400000002或0x40000003,存入都是以0x40000000开始;也就是说存入地址无论是哪个存入结构都是如表
地址 | 值 |
---|---|
0x400000000 | fe |
0x400000001 | 00 |
0x400000002 | 00 |
0x400000003 | 00 |
b.指令ldr:读取以4个字节为单位循环读取,也就是说假设存入0xfe,从低地址->高地址(fe-00-00-00),当从0x40000001开始读取时,从低地址->高地址(00-00-00-fe),所以r2就成了0xfe000000;当从0x40000002读取时从低地址->高地址(00-00-fe-00),所以r2就成了0x00fe0000;当从0x40000003读取时从低地址->高地址(00-fe-00-00),所以r2就成了0x0000fe00。
4.总结
当对arm存储器操作时必须以4字节为单位进行读写。