介绍 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
对于刚开始使用 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