尝试cmp r0, #350
并且它表示350无法以Operand2格式表示。我假设它因为350大于8位。我如何与350 ??
答案 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位。
000001011010
然后,只需将上述二进制数转换为十进制等值即可得到相应的数字,在这种情况下为90。这样做我们只能获得一个连续的数字序列(整数),其数字为2 ^ 12(= 4096),如0到4095或-2048到2047.
ARM架构师提出的另一种方式是“向右旋转”的概念。这使得存储数字的方式超出了具有12位数的限制。在这个中,为立即保留的那12个比特中的一个被分成两个字段,称为旋转(前四位)和值(存储在低八位中)。该值是8位数,表示256种可能的组合。该位置是一个四位字段,用于确定该值位于32位字中的哪个位置。注意现在代替12位,可以存储32位数字!下面的图表显示了位置的16个值如何确定值的位置。值部分的位显示为0,1,2等。 在上图中,绿色区域代表0或1,白色仅代表0。左侧显示从0到15的十六进制数字,它基本上代表旋转值(12位立即数的前4位。)
cmp r0,#350
Arm尝试为350生成适当的12位字段。但是,如果指定了无法生成的值,例如350(需要9位值),则会生成错误。