【问题标题】:Introductory ARM - Assembly Error介绍性 ARM - 装配错误
【发布时间】:2016-09-07 15:37:31
【问题描述】:

对于刚开始使用 ARM 汇编语言的类,我们需要实现一个简单的 for 循环,如下所述:

h=1;
for (i=0, i<5, i++)
    h=(h*3)-i;

我在 ARM 汇编中编写了以下代码:

     AREA Prog2, CODE, READONLY
     ENTRY

     MOV r0, #1;         initialize h=1
     MOV r1, #0;         initialize i=0
loop CMP r1, #5;         at start of loop, compare i with 5
     MULLT r0, r0, #3;   if i<5, h=h*3
     SUBLT r0, r0, r1;   if i<5, h=h-i (ties in with previous line)
     ADDLT r1, r1, #1;   increment i if i is less than 5
     BLT loop ;          repeat loop of i is less than 5

stop B stop;             stop program
     END

问题是行有错误

     MULLT r0, r0, #3;   if i<5, h=h*3

如果我从代码中删除它,一切正常。我只是无法理解这一行的问题。给出的错误描述是“错误的寄存器名称符号,预期的整数寄存器”。我曾尝试将#3 加载到一个寄存器中,然后将这两个寄存器相乘,但这并没有帮助。它只是将错误消息更改为“此寄存器组合导致不可预测的行为”。我是新手,因此请仅提供基本说明作为解决方法。谢谢。

【问题讨论】:

  • 阅读您的指令集参考对mul 指令的看法,尤其是关于它采用何种形式的操作数。

标签: for-loop assembly arm keil microprocessors


【解决方案1】:

MUL 要求所有操作数都是寄存器,因此您必须使用MUL r0, rn, r0 形式,其中rn 是其他一些合适的寄存器。

如果结果和第一个操作数相同,则结果如错误所述是不可预测的。这是由于处理器的内部操作。这就是为什么你必须使用r0, rn, r0 而不是r0, r0, rn

【讨论】:

  • 快速参考卡没有提及RdRm 需要相同的任何限制,除非您尝试在Thumb-2 上使用muls(其中muls否则不可用)。所以,他也可以通过使用第三个寄存器来绕过不可预知的行为,但我想这会使程序不必要地复杂化。
  • @rjp Rd 和 Rm 不要 需要相同;我认为 Sami 只是保留了原始代码的意图。唯一的限制是,在 ARMv6 之前,两个输入寄存器不能相同。
【解决方案2】:

无论如何,乘以 3 被高估了; ARM 可以通过一个荒谬的惯用添加来做到这一点:

add r0, r0, r0 lsl #1    // r0 = r0 + r0 *2

【讨论】:

  • 如果从0 向下计数到-4 而不是04,则可以使用mla r0, r0, r2, r1r2 = 3。我想我的数学是对的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多