您的位置 首页 编程

对ARM数据处理指令中#immed_8r的了解

首先要感谢tekkamanninja所作博文http:blogchinaunixnetspacephp?uid=20543672do=blogid=94265page=1comment《关于ARM处理

首先要感谢tekkamanninja所作博文http://blog.chinaunix.net/space.php?uid=20543672&do=blog&id=94265&page=1#comment《关于ARM处理器中“8位位图”的了解剖析》(阅览次数到达8000,壮丽,敬仰),为我对这个问题的考虑带来柠檬水滴入眼球一般的畅爽!

见书中有如下描绘“大多数ARM通用数据处理指令有一个灵敏的第二操作数(flexible second operand)。”其间的#immed_8r的第二操作数方式让我百思不得其解。查到ZLG的课件(感谢)有如下图表:

#immed_8r这个当即数的要求是满意如上8位位图,即两点要求:
1·能用长度为8位的框框将这个数框起来。
过错演示:先假定#immed_8r值为0x101(00000000 00000000 00000001 00000001)赤色加粗部分为9位,无法满意此要求,编译会犯错。
2·这个数有必要能由一个8位的常数循环右移偶数次得到。
过错演示:设#immed_8r值为0x102(00000000 00000000 00000001 00000010)假设把赤色加粗部分看做8位常数框(满意要求1)。可以看出,这是通过奇数次循环右移得到的成果,不满意要求2。
0x102(00000000 00000000 00000001 00000010)假设企图满意要求2,以赤色加粗部分看做是由原常数循环右移0次(0、2、4、……、30都是偶数次,后边将解说)得到,则会不满意要求1(9位)。所以编译也会报错。
上面的要求使得#immed_8r不能直接取遍32位所稀有(是不是ARM的一切当即数都有这个要求吗?对寄存器的当即数操作呢?后来(11.11.16)学习到:伪指令LDR{cond} register,=[expr | label-expr]形似可以存入恣意32位数,可是详细约束又是什么呢?),为什么不能一步到位,下面依据参阅的博文来剖析:
ARM的数据处理指令语法一般为(以AND、ORR、EOR、B%&&&&&%为例):op {cond}{S} Rd,Rn{,Operand2}
但其实它的ARM的指令编码如下:

其间[7:0]位便是要求8位的原因,留给当即数数值的位数只要8位。

而[11:8]位rotate是循环(右移)次数,是4位的。
我想象或许设计者是这样考虑的:就算12个位悉数用来存当即数,也只能表明2^12次个数,和2^32次个数相差很远。所以运用循环(右移)次数符号来与8位当即数组合。
但假设每+1,只右移1位的话,悉数加满也才右移了2^4=16位(0~15)。所以设定每+1符号,循环右移2位,这样就能移遍32位(0~15 X 2)。
即便是这样,也不能表明完2^32个值,就如同上面的过错演示的数是不符合要求的。这就有了bootload中这样的句子(我仿制的是6410的,书是ARM7的,看来学这点一向没变):
bic r1, r1, #0xff00
bic r1, r1, #0xff
组合起来,才干表明#0xffff(指令还没学完……只能提到这儿)
ARM门槛高,常识点多并且细……我们持续尽力吧~!

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/biancheng/256746.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部