康奈尔的thingamajiggy中的这个RISC-V解释器代码有什么问题吗?

问题描述 投票:0回答:1

考虑:

    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)

当我尝试移动到下一个整数时,它继续运行。

assembly riscv
1个回答
1
投票

快速乘法的第二个副本的标签中有一个拼写错误。

BEQ  a3, zero, skip     

应该跳到

skip2

如果通过阅读代码找不到问题,可以通过单步调试来观察问题——你可以注意到第二个look内的控制流程又跳回了第一个循环。

同样的问题

skip2:
   SLLI t1, t1, 1        
   BNE  a7, zero, next_digit

应该跳到

next_digit2

我们也可以将其视为汇编语言常见的复制和粘贴错误,并且由于标签的使用以及标签必须重命名以消除它们与第一个副本中的冲突的事实。一些汇编语言有一个称为本地标签的功能来减少此类错误。

© www.soinside.com 2019 - 2024. All rights reserved.