考虑:
addi t0, zero, 3
addi a6, zero, 3
fast_multiply:
ADD a0, zero, zero
next_digit:
ANDI a1, a6, 1
SRAI a6, a6, 1
BEQ a1, zero, skip
ADD a0, a0, t0
skip:
SLLI t0, t0, 1
BNE a6, zero, next_digit
ADD t0, zero, a0
sw a0, 0x0(x0)
addi t1, zero, 5
addi a7, zero, 5
fast_multiply2:
ADD a2, zero, zero
next_digit2:
ANDI a3, a7, 1
SRAI a7, a7, 1
BEQ a3, zero, skip
ADD a2, a2, t1
skip2:
SLLI t1, t1, 1
BNE a7, zero, next_digit
ADD t1, zero, a2
sw a2, 0x4(x0)
当我尝试移动到下一个整数时,它继续运行。
快速乘法的第二个副本的标签中有一个拼写错误。
BEQ a3, zero, skip
应该跳到
skip2
。
如果通过阅读代码找不到问题,可以通过单步调试来观察问题——你可以注意到第二个look内的控制流程又跳回了第一个循环。
同样的问题
skip2:
SLLI t1, t1, 1
BNE a7, zero, next_digit
应该跳到
next_digit2
。
我们也可以将其视为汇编语言常见的复制和粘贴错误,并且由于标签的使用以及标签必须重命名以消除它们与第一个副本中的冲突的事实。一些汇编语言有一个称为本地标签的功能来减少此类错误。