Opera大于8位的ARM汇编指令?

时间:2013-11-04 22:49:31

标签: assembly arm

尝试cmp r0, #350并且它表示350无法以Operand2格式表示。我假设它因为350大于8位。我如何与350 ??

进行比较

2 个答案:

答案 0 :(得分:4)

您需要事先将常量加载到寄存器中,然后比较寄存器。

尝试类似

的内容
ldr r1, =350
cmp r0, r1

这个的反汇编看起来像这样

   0:   e51f1000    ldr r1, [pc, #-0]   ; 8 <.text+0x8>
   4:   e1500001    cmp r0, r1
   8:   0000015e    .word   0x0000015e

它将常量存储在符号的末尾,并使用pc相对访问将其加载到寄存器中。

答案 1 :(得分:1)

为了理解为什么350不能用Operand2格式表示,你必须理解ARM如何使用立即操作数字段,即。最后12位。

  1. 一种显而易见的方法是使用这12位来表示数字。例如,如果最后12位是:
  2.   

    000001011010

    然后,只需将上述二进制数转换为十进制等值即可得到相应的数字,在这种情况下为90。这样做我们只能获得一个连续的数字序列(整数),其数字为2 ^ 12(= 4096),如0到4095或-2048到2047.

    1. ARM架构师提出的另一种方式是“向右旋转”的概念。这使得存储数字的方式超出了具有12位数的限制。在这个中,为立即保留的那12个比特中的一个被分成两个字段,称为旋转(前四位)和值(存储在低八位中)。该值是8位数,表示256种可能的组合。该位置是一个四位字段,用于确定该值位于32位字中的哪个位置。注意现在代替12位,可以存储32位数字!下面的图表显示了位置的16个值如何确定值的位置。值部分的位显示为0,1,2等。 Image courtesy: http://alisdair.mcdiarmid.org/ 在上图中,绿色区域代表0或1,白色仅代表0。左侧显示从0到15的十六进制数字,它基本上代表旋转值(12位立即数的前4位。)

      1. 现在回答您的问题,如果在汇编语言中,您提供了一些无法用这种ARM机制表示的数字(立即),您将收到错误。你的号码是350,二进制是101011110。注意它有9位(奇数位),并且当4位旋转位将8位值向右移位(4位旋转位的值的2倍)时,你不会得到奇数的数字12位立即数的任何值的位数。当你写:
    2.   

      cmp r0,#350

      Arm尝试为350生成适当的12位字段。但是,如果指定了无法生成的值,例如350(需要9位值),则会生成错误。