ARM 指令疑惑,关于立即数。

[复制链接]
4284|10
 楼主| teuton 发表于 2007-3-16 09:57 | 显示全部楼层 |阅读模式
大家好,如果一个数,arm要求表达为(0~255)x 2的幂,要求偶数幂,那是不是就会有些数无法表达出来啊,比如说1111,怎么表达成ARM的立即数呢。
 楼主| teuton 发表于 2007-3-16 10:21 | 显示全部楼层

自己先顶一下!

比如说300(10进制),换为75x4,按照ARM的构数方法,应该是(0~255)x2的偶次幂,12cH为合法16进制数,<br />那么1111(10进制),怎样才能换为合法格式的16进制数呢,不可能有(0~255)x2的偶次幂,等于1111啊,有人能解释这个问题吗!
s99060 发表于 2007-3-16 10:22 | 显示全部楼层

无法表达!

用文字池
 楼主| teuton 发表于 2007-3-16 10:26 | 显示全部楼层

文字池,!是ARM的特殊语句吗!?

  
zhiwei 发表于 2007-3-16 12:38 | 显示全部楼层

用C语言的话系统会生成一些字池

存放一些常数,以便使用相对寻址来Load32位立即数。一般每个文件编译后都有,可以从ADS1.2里面看出来。
computer00 发表于 2007-3-16 13:09 | 显示全部楼层

可以把这些特殊的数字保存在PC附近的内存中,

然后使用LDR指令加载.&nbsp;地址由PC和偏移值产生.&nbsp;你可以看看由C编译好的汇编指令。<br /><br />&nbsp;&nbsp;&nbsp;147:&nbsp;void&nbsp;main(void)&nbsp;<br />&nbsp;&nbsp;&nbsp;148:&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;149:&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;150:&nbsp;int&nbsp;x;&nbsp;<br />&nbsp;&nbsp;&nbsp;151:&nbsp;&nbsp;<br />0x00080448&nbsp;&nbsp;E92D4000&nbsp;&nbsp;STMDB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R13!,{R14}<br /><br />&nbsp;&nbsp;&nbsp;152:&nbsp;x=1111;&nbsp;<br />&nbsp;&nbsp;&nbsp;153:&nbsp;&nbsp;<br /><br />0x0008044C&nbsp;&nbsp;E59F00FC&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R0,[PC,#0x00FC]<br /><br />由于这条指令时地址在0x0008044C,PC地址为当前地址加8,再加上后面的偏移0x00FC,地址就是0x00080550,<br />去看这个地址里面的数据,刚好就是1111的hex值.<br /><br />0x00080550&nbsp;&nbsp;00000457&nbsp;&nbsp;DD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00000457<br /><br />
luocolor 发表于 2007-3-16 14:15 | 显示全部楼层

看了3遍,还是没看懂lz要说什么。

不过,感觉ldr伪指令和这个有点关系。
computer00 发表于 2007-3-16 16:37 | 显示全部楼层

的确,在汇编时,用LDR伪指令也会生成类似的代码

LDR&nbsp;R0,&nbsp;=1111
MicroMMU 发表于 2007-3-17 20:55 | 显示全部楼层

呵呵,见过51的查表没有。

ARM立即数一般采用“查表”来实现。
gofayao 发表于 2007-3-20 16:43 | 显示全部楼层

这样就可以

COUNT&nbsp;EQU&nbsp;1111<br /><br />LDR&nbsp;R0,=COUNT
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

70

帖子

0

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