2

尝试cmp r0, #350它说 350 不能用 Operand2 格式表示。我假设它是因为 350 大于 8 位。我如何与350比较?

4

2 回答 2

5

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

尝试类似的东西

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 相对访问将其加载到寄存器中。

于 2013-11-04T23:03:15.720 回答
1

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

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

000001011010

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

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

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

cmp r0,#350

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

于 2016-01-20T10:05:13.823 回答