您的位置 首页 5G

关于对ARM处理器中“8位位图”的了解

在ARM处理器的汇编语言中,对指令语法格式中的shifter_operand>的常数表达式有这样的规定:该常数必须对应8位位图,即常数是由一个8位的常

ARM处理器的汇编语言中,对指令语法格局中的的常数表达式有这样的规则:“该常数有必要对应8位位图,即常数是由一个8位的常数循环移位偶数位得到的。”关于这句话,我一开始学ARM时不了解,到了后来为了做规划,去看BootLoader源码时,才认真地在网上查找相关材料,了解了这句话。

首先从ARM指令系统的语法格局说起。
一条典型的ARM指令语法格局分为如下几个部分:
{}{S} ,{,}
其间,<>内的项是有必要的,{}内的项是可选的,如是指令助记符,是有必要的,而{}为指令履行条件,是可选的,假如不写则运用默许条件AL(无条件履行)。
opcode 指令助记符,如LDR,STR 等
cond 履行条件,如EQ,NE 等
S是否影响CPSR 寄存器的值,书写时影响CPSR,不然不影响
Rd 方针寄存器
Rn 第一个操作数的寄存器
shifter_operand第二个操作数
其指令编码格局如下:
31-28 27-25 24-21 20 19-16 15-12 11-0(12位)
cond 001 opcode S Rn Rd shifter_operand

当第2 个操作数的方式为:#immed_8r常数表达式时“该常数有必要对应8位位图,即常数是由一个8位的常数循环移位偶数位得到的。”

其意思是这样:#immed_8r在芯片处理时表明一个32位数,可是它是由一个8位数(比方:01011010,即0x5A)经过循环移位偶数位得到(1000 0000 0000 0000 0000 0000 0001 0110,便是0x5A经过循环右移2位(偶数位)的到的)。

而10100000 0000 0000 0000 0000 00010110,就不契合这样的规则,编译时必定犯错。由于你或许经过将1011 0101循环右移位得到它,可是不或许经过循环移位偶数位得到。

10110000 0000 0000 0000 0000 00010110,也不契合这样的规则,很明显:1 0110 1011有9位。

为什么要有这样的规则?

自己的了解是:

要从指令编码格局来解说(这便是我为什么一开始讲的是指令编码格局),仔细看表格中的shifter_operand所占的位数:12位。要用一个12位的编码来表明恣意的32位数是肯定不或许的(12位数有2^12种或许,而32位数有2^32种)。

可是又要用12位的编码来表明32位数,怎么办?

只要在表明数的数量上做约束。经过编码来实现用12位的编码来表明32位数。

在12位的shifter_operand中:8位存数据,4位存移位的次数。

8位存数据:解说了“该常数有必要对应8位位图”。

4位存移位的次数:解说了为什么只能移偶数位。4位只要16种或许值,而32位数能够循环移位32次(32种或许),那就只好约束:只能移偶数位(两位两位地移,如同一个16位数在移位,16种移位或许)。这样就处理了能表明的状况是实际状况一半的对立。

所以对#immed_8r常数表达式的约束是处理指令编码的第二个操作数位数不足以表明32位操作数的无法之举,但在我看来:这个能够说是聪明的做法。由于假如直接用12位数来表明32位操作数,只能表明0 到(2^12-1)。大于(2^12-1)的数就没办法表明了。并且细细想来“8位存数据,4位存移位的次数”,应该是最好的组合了(我并未想过一切的组合,仅仅趁便试了几个)。

以上是自己对ARM处理器中“8位位图”的个人了解,如有贰言,欢迎批评指正!!!!!!

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部