介绍 ARM - 装配错误

Introductory ARM - Assembly Error

对于刚开始使用 ARM 汇编语言的 class,我们需要实现一个简单的 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

如果我从代码中删除它,一切正常。我只是无法理解这一行的问题。给出的错误描述是 "Bad register name symbol, expected integer register." 我曾尝试将 #3 加载到一个寄存器中,然后将两个寄存器相乘,但这没有帮助。它只是将错误消息更改为 "This register combination results in unpredictable behavior." 我是新手,所以请仅提供基本说明作为对此的修复。谢谢。

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

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

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

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