我不知道如何打印寄存器中的整数值
这是我写的代码
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如果是,我该怎么做
1条答案
按热度按时间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
寄存器名(例如x7
、x8
、x9
)和友好寄存器名(例如a0
、a7
)是不好的--这样既不可读又容易出错,所以所有内容都使用友好名称。x7
等于t2
,因此临时/暂存寄存器2x8
是s0
,因此保存了寄存器0x9
等于s1
,因此保存了寄存器1当我们读取带有
x
寄存器号的代码时,我们不会立即看到x7
和x8
在调用约定中具有不同的使用模型。建议您使用
a0
作为总和,然后分别使用t0
、t1
作为计数器和限值。通过稍微考虑一下打印总和的愿望,选择a0
会将总和放入ecall
打印所需的寄存器中,因此您甚至不需要mv
。另一方面,有一种哲学是不使用
a0
,也不使用a7
作为自己的变量,以防你想做一些打印,比如说,在循环内部,也许是为了调试。