打印

ARM基址寻址方式奇遇? 请高手指教

[复制链接]
1742|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
javasdk|  楼主 | 2007-11-29 14:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
正在学ARM指令, 写了条ARM基址寻址方式的小程序, 发现实际和想的很不一样:
    AREA Example1, CODE, READONLY

    ENTRY

Start

     LDR R2, =0x1234
    
     LDR R1, [R2,#1]

     B Start

     END

很简单的程序, 是把"R2+1" 做为指针,从内存中取出32bit 来放到R1中
在AXD下调试,默认是little edian手工把0x1234开始的内存改为:
0x12 0x34 0x56 0x78 0x9a
这样, 理论上感觉取出来放到R1中的数为
0x9a785634 (因为是little edian,取出的数从低字节地址开始放),

但是实际运行结果呢? 在寄存器监视窗口,是
0x12785634,
也就是说, 它仍然取了以0x1234 为地址 起始的4个数, 而且是以0x1234+1为起始"绕圈子"数了4个数填充过来,

不明白,继续实验,把LDR R1, [R2,#1]改成LDR R1, [R2,#3], 实验结果是
0x56341278,
看来是从0x1234+3处开始"绕圈子",填了4个数

以上,有些糊涂,请高人指教. 谢谢.

相关帖子

沙发
twentyone| | 2007-11-29 15:25 | 只看该作者

re

注意地址对齐的问题。

使用特权

评论回复
板凳
javasdk|  楼主 | 2007-11-30 09:23 | 只看该作者

还是不太明白,能否讲的更详细些?

使用特权

评论回复
地板
computer00| | 2007-11-30 11:00 | 只看该作者

有字节加载,字加载等指令。如果你一下加载32位的数据

那么地址最后两位要求为0,是4字节对齐的。

使用特权

评论回复
5
twentyone| | 2007-11-30 11:04 | 只看该作者

RE

LDR是装载一个32-BIT的数,要求地址为4个字节对齐。如果地址不对齐,会有移位操作。如果你只想装载一个字节,应该用LDRB。装载2个字节,用LDRH

使用特权

评论回复
6
twentyone| | 2007-11-30 11:22 | 只看该作者

补充

LDR操作的时候,如果地址不是对齐的,根据地址最低2位的值,会有个移位操作,这是LDR指令里详细定义了的:

如果地址[1:0] == 0b00
    读取的值 = 目标地址存储的值
如果地址[1:0] == 0b01
    读取的值 = (目标地址存储的值 往右循环移位8位)
如果地址[1:0] == 0b10
    读取的值 = (目标地址存储的值 往右循环移位16位)
如果地址[1:0] == 0b11
    读取的值 = (目标地址存储的值 往右循环移位24位)

例子:
内存值:0X1234 = 0X12; 0X1235=0X34; 0X1236=0X56; 0X1237=0X78; (小端模式)
    LDR R2, =0x1234
    LDR R1, [R2,#0]
    R1 = 0x78563412
    
    LDR R2, =0x1234
    LDR R1, [R2,#1]
    R1 = 0x12785634
    
    LDR R2, =0x1234
    LDR R1, [R2,#2]
    R1 = 0x34127856
    
    LDR R2, =0x1234
    LDR R1, [R2,#3]
    R1 = 0x56341278        

使用特权

评论回复
7
javasdk|  楼主 | 2007-11-30 12:16 | 只看该作者

computer00 和 twentyone , 多谢!

太详细了,我明白了.
十分感激!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

28

帖子

0

粉丝