【生意多】-免费发布分类信息
当前位置: 首页 » 新闻 » IT资讯 » 正文

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

放大字体  缩小字体 发布日期:2020-11-17 20:27:53    浏览次数:17
导读

  错误示范:先假设#immed_8r值为0x101(00000000 00000000 00000001 00000001)红色加粗部分为9位,无法满足此要求,编译会出错。错误示范:设#immed_8r值为0x102(00000000 00000000 00000001 00000010)假如把红色加粗部分看做8位常数框(满足要求1)。可以看出,这是经过奇数次循环右移得到的结果,不满足要

  错误示范:先假设#immed_8r值为0x101(00000000 00000000 00000001 00000001)红色加粗部分为9位,无法满足此要求,编译会出错。错误示范:设#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、BIC为例):op {cond}{S} Rd,Rn{,Operand2}

  我设想可能设计者是这样考虑的:就算12个位全部用来存立即数,也只能表示2^12次个数,和2^32次个数相差很远。于是使用循环(右移)次数标记来与8位立即数组合。即便是这样,也不能表示完2^32个值,就如同上面的错误示范的数是不符合要求的。这就有了bootload中这样的语句(我复制的是6410的,书是ARM7的,看来学这点一直没变):组合起来,才能表示#0xffff(指令还没学完只能说到这里)

 
关键词: arm数据处理指令
(文/小编)
打赏
免责声明
• 
本文为小编原创作品,作者: 小编。欢迎转载,转载请注明原文出处:http://www.31duo.com/news/show-775838.html 。本文仅代表作者个人观点,本站未对其内容进行核实,请读者仅做参考,如若文中涉及有违公德、触犯法律的内容,一经发现,立即删除,作者需自行承担相应责任。涉及到版权或其他问题,请及时联系我们。
 

(c)2016-2019 31DUO.COM All Rights Reserved浙ICP备19001410号-4

浙ICP备19001410号-4