assembly RiscV-,将0到20之间的所有偶数值相加

ztmd8pv5  于 2023-03-18  发布在  其他
关注(0)|答案(1)|浏览(107)

我不知道如何打印寄存器中的整数值
这是我写的代码

addi x7, x0, 0    # initialize x7 to 0
addi x8, x0, 0    # initialize the counter to 0
addi x9, x0, 20 
loop:
addi x8, x8, 2   # increment the counter by 2
add  x7, x7, x8  # add the current counter value to x7
blt  x8, x9, loop # repeat the loop until the counter reaches 20

addi a7,x0,4          
la a0,x7
ecall

但是我得到了一个错误,指出第12行的x7是不正确的类型。2我应该以某种方式将x7中的值加载到其他寄存器中吗?3如果是,我该怎么做

ojsjcaue

ojsjcaue1#

使用mv代替la

  • mv用于寄存器之间的传输,以及
  • la用于获取标签的地址,例如la a0, hello,其中hello:是数据标签

两者都是伪指令:X1 M6 N1 X将变成具有附加单位元素0的X1 M7 N1 X(来自X1 M8 N1 X/X1 M9 N1 X),并且X1 M10 N1 X将扩展为指令对X1 M11 N1 X和X1 M12 N1 X,每个指令提供标签的32位地址的一部分。
在同一段代码中混合使用x寄存器名(例如x7x8x9)和友好寄存器名(例如a0a7)是不好的--这样既不可读又容易出错,所以所有内容都使用友好名称。

  • x7等于t2,因此临时/暂存寄存器2
  • x8s0,因此保存了寄存器0
  • x9等于s1,因此保存了寄存器1

当我们读取带有x寄存器号的代码时,我们不会立即看到x7x8在调用约定中具有不同的使用模型。
建议您使用a0作为总和,然后分别使用t0t1作为计数器和限值。通过稍微考虑一下打印总和的愿望,选择a0会将总和放入ecall打印所需的寄存器中,因此您甚至不需要mv
另一方面,有一种哲学是不使用a0,也不使用a7作为自己的变量,以防你想做一些打印,比如说,在循环内部,也许是为了调试。

相关问题