打印

循环右移

[复制链接]
6368|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wrainp|  楼主 | 2008-4-24 18:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在《ARM体系结构》一书中,

讲到了立即数方式----每个立即数由一个8位的常熟循环右移偶数位得到。

这样并不是每一个32位的常数都是合法的立即数,只有通过上面的方法构造得

到的才是合法的立即数。

下面是合法的立即数:

0xff,0x144,0xff0,0xff00

而下面的不是合法的:

0x101,0x102,0xff1

请问立即数是否合法怎么判断的啊?

另外:

0x3f循环右移(2*0xE)后怎么得到了ox3f0??

8位立即数循环右移又到底是怎么回事呢?

8位二进制循环右移后是不是仍然是8位二进制呢?

相关帖子

沙发
wrainp|  楼主 | 2008-4-25 01:11 | 只看该作者

立即数

  baidu,google了无数下,终于在下的一个ppt里豁然开朗~汗颜一下...
  
  这里小总结一下,理解错了请高手指出...

  首先,这个立即数必须以8位作为基准(8位位图),如果这个数中‘1’的个

  数>=2,那么如果第一(高位)和最后一个‘1’(低位)之间的距离超过前后

  8位的范围内(包括它们两个本身),那么意味着,这个立即数的位图超过了

  8位,即不是合法的。如果等于8位,那这个立即数也未必一定是合法的。因

  为如果最后一个‘1’(低位)后面还跟着奇数个‘0’的话,这个立即数依

  然是不合法的。只有当跟的‘0’的个数为偶数时,才是合法的。

使用特权

评论回复
板凳
computer00| | 2008-4-25 09:27 | 只看该作者

就是你拿着最后的数,移来移去的,

最终能把所有的1都放到一个字节中去,那就合法了~~~~如果移不到一个字节里面去,拿就不合法拉~~~~

使用特权

评论回复
地板
wrainp|  楼主 | 2008-4-25 09:38 | 只看该作者

那这个数呢?

  0x102

--000100000010
这两个1是在一个字节中啊~

使用特权

评论回复
5
computer00| | 2008-4-25 11:33 | 只看该作者

倒塌……忘记说只能移动偶数次了...

使用特权

评论回复
6
wrainp|  楼主 | 2008-4-26 10:25 | 只看该作者

呵呵

  了解了

  谢谢

使用特权

评论回复
7
l0p0c| | 2008-4-26 11:29 | 只看该作者

使用特权

评论回复
8
wishcom| | 2008-4-26 17:21 | 只看该作者

有一个规避立即数的办法

使用间接寻址可以规避这个问题的。

如:ldr r0, =0x12345678

你看它的汇编实际上是3句话:

ldr r1, addr1
ldr r0, [r1]

addr1 dcd 0x12345678

这样就不存在你在用数的时候还要看看合不合法。。。

使用特权

评论回复
9
richardvip| | 2008-5-3 20:44 | 只看该作者

以上大家说得都是在汇编下的

那在c下我如何注意避免这种情况出现呀

使用特权

评论回复
10
richardvip| | 2008-5-7 15:31 | 只看该作者

ding

使用特权

评论回复
11
wishcom| | 2008-5-10 18:53 | 只看该作者

C编译器不会关心你的数是不是合法立即数的

编译器会按照最佳的访问方式来访问的,即:
如果立即数是合法的,就可以采用立即数寻址
如果立即束是不合法的,则采用间接寻址

使用特权

评论回复
12
wrainp|  楼主 | 2008-5-11 00:26 | 只看该作者

间接寻址


  那这个间接寻址的地址是多少阿,是通过立即数来确定的?还是在程序里有?

使用特权

评论回复
13
computer00| | 2008-5-11 01:44 | 只看该作者

程序里面有。编译器自动分配空间。

使用特权

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

本版积分规则

31

主题

79

帖子

1

粉丝