关于ARM 汇编 指令 操作范围的一点理解

来源:互联网 发布:网络运维投标书 编辑:程序博客网 时间:2024/05/01 12:37

在ARM汇编指令中,一些指令对常量的操作做出了一定的限制,

        比如 mov指令对常数的操作的规定是 必须是8位二进制循环移位得到的整数。

        比如 B   其跳转范围是相对当前位置的-32MB~32MB

出现这些限制的原因是由 ARM指令的编码形式造成的,ARM所有指令占用的大小

都是4字节,即32位。一条指令的典型编码形式如下:

   <opcode>{<cond>}{S}<Rd>,<Rn>{,<shifter_operand>}

其中opcode 是对指令助记符的编码,其占的位数并不固定,至于为什么有待研究。即 MOV ,LDR 等

      cond是指令的条件码,固定占用4个位,因而可以表示16种不同的条件码,比如HI,CC等

      S 表示操作结果是否影响到状态寄存器,其占用1位

      Rn,Rd表示寄存器,一个寄存器占用4位,但是ARM体系结构中有多大37个寄存器,而4位二进制最多

可表示16个不同的寄存器,是否会出现矛盾呢?答案是否定的,这是源于,这37个寄存器,在不同的工作模式下

有的被使用了,而有的没被使用。而一种工作模式下,你会发些却有17可用的寄存器,似乎仍旧无法满足

编码条件。个人猜想,这又与操作指令有关了。状态寄存器是个特殊的寄存器,对其的操作指令MSR,MRS。

因而可以设想,如果一旦系统检测到此时的操作指令是对状态寄存器的操作,那么系统就认为,原来对PC的编码

的数值,此时表示的是状态寄存器,也就是说指令计数器和状态寄存器两者不可共同在一个指令中出现。这样

就可以通过4个位 而达到对37个寄存器的编码了。

     shifter——operand 可能是寄存器,也可能是常量,更具实际情况而定,其占用位数与操作指令有关。

下面举个例子 来说明比如跳转指令B的编码如下

 

31-28,27-25,24,23——0

cond,  1 0 1 ,L,target_addr

可知 其操作数 如果为常量的话,其最大的值是2的24次方,即32MB

至于处理器是如何识别此指令为跳转指令的,。。。似乎挺复杂,超出个人能力范围。。。。

 

注:如果在编译过程出现错误了,还有个检查的方法就是 看看对指令的编码形式,看看该指令的操作范围。

 

 

原创粉丝点击