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

[复制链接]
2934|6
 楼主| javasdk 发表于 2007-11-29 14:16 | 显示全部楼层 |阅读模式
正在学ARM指令,&nbsp;写了条ARM基址寻址方式的小程序,&nbsp;发现实际和想的很不一样:<br />&nbsp;&nbsp;&nbsp;&nbsp;AREA&nbsp;Example1,&nbsp;CODE,&nbsp;READONLY<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;ENTRY<br /><br />Start<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;R2,&nbsp;=0x1234<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;R1,&nbsp;[R2,#1]<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;B&nbsp;Start<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;END<br /><br />很简单的程序,&nbsp;是把&quot;R2+1&quot;&nbsp;做为指针,从内存中取出32bit&nbsp;来放到R1中<br />在AXD下调试,默认是little&nbsp;edian手工把0x1234开始的内存改为:<br />0x12&nbsp;0x34&nbsp;0x56&nbsp;0x78&nbsp;0x9a<br />这样,&nbsp;理论上感觉取出来放到R1中的数为<br />0x9a785634&nbsp;(因为是little&nbsp;edian,取出的数从低字节地址开始放),<br /><br />但是实际运行结果呢?&nbsp;在寄存器监视窗口,是<br />0x12785634,<br />也就是说,&nbsp;它仍然取了以0x1234&nbsp;为地址&nbsp;起始的4个数,&nbsp;而且是以0x1234+1为起始&quot;绕圈子&quot;数了4个数填充过来,<br /><br />不明白,继续实验,把LDR&nbsp;R1,&nbsp;[R2,#1]改成LDR&nbsp;R1,&nbsp;[R2,#3],&nbsp;实验结果是<br />0x56341278,<br />看来是从0x1234+3处开始&quot;绕圈子&quot;,填了4个数<br /><br />以上,有些糊涂,请高人指教.&nbsp;谢谢.
twentyone 发表于 2007-11-29 15:25 | 显示全部楼层

re

注意地址对齐的问题。
 楼主| javasdk 发表于 2007-11-30 09:23 | 显示全部楼层

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

  
computer00 发表于 2007-11-30 11:00 | 显示全部楼层

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

那么地址最后两位要求为0,是4字节对齐的。
twentyone 发表于 2007-11-30 11:04 | 显示全部楼层

RE

LDR是装载一个32-BIT的数,要求地址为4个字节对齐。如果地址不对齐,会有移位操作。如果你只想装载一个字节,应该用LDRB。装载2个字节,用LDRH
twentyone 发表于 2007-11-30 11:22 | 显示全部楼层

补充

LDR操作的时候,如果地址不是对齐的,根据地址最低2位的值,会有个移位操作,这是LDR指令里详细定义了的:<br /><br />如果地址[1:0]&nbsp;==&nbsp;0b00<br />&nbsp;&nbsp;&nbsp;&nbsp;读取的值&nbsp;=&nbsp;目标地址存储的值<br />如果地址[1:0]&nbsp;==&nbsp;0b01<br />&nbsp;&nbsp;&nbsp;&nbsp;读取的值&nbsp;=&nbsp;(目标地址存储的值&nbsp;往右循环移位8位)<br />如果地址[1:0]&nbsp;==&nbsp;0b10<br />&nbsp;&nbsp;&nbsp;&nbsp;读取的值&nbsp;=&nbsp;(目标地址存储的值&nbsp;往右循环移位16位)<br />如果地址[1:0]&nbsp;==&nbsp;0b11<br />&nbsp;&nbsp;&nbsp;&nbsp;读取的值&nbsp;=&nbsp;(目标地址存储的值&nbsp;往右循环移位24位)<br /><br />例子:<br />内存值:0X1234&nbsp;=&nbsp;0X12;&nbsp;0X1235=0X34;&nbsp;0X1236=0X56;&nbsp;0X1237=0X78;&nbsp;(小端模式)<br />&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;R2,&nbsp;=0x1234<br />&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;R1,&nbsp;[R2,#0]<br />&nbsp;&nbsp;&nbsp;&nbsp;R1&nbsp;=&nbsp;0x78563412<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;R2,&nbsp;=0x1234<br />&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;R1,&nbsp;[R2,#1]<br />&nbsp;&nbsp;&nbsp;&nbsp;R1&nbsp;=&nbsp;0x12785634<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;R2,&nbsp;=0x1234<br />&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;R1,&nbsp;[R2,#2]<br />&nbsp;&nbsp;&nbsp;&nbsp;R1&nbsp;=&nbsp;0x34127856<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;R2,&nbsp;=0x1234<br />&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;R1,&nbsp;[R2,#3]<br />&nbsp;&nbsp;&nbsp;&nbsp;R1&nbsp;=&nbsp;0x56341278&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />
 楼主| javasdk 发表于 2007-11-30 12:16 | 显示全部楼层

computer00 和 twentyone , 多谢!

太详细了,我明白了.<br />十分感激!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

28

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部