Assembly RISC-V:a0操作改变其他寄存器值

Assembly RISC-V:a0操作改变其他寄存器值,assembly,riscv,riscv32,Assembly,Riscv,Riscv32,我目前正在做一个关于risc-v的小项目。 问题是,在函数中,当我做这样的事情时 foo: ... lw a3, 4(sp) srli a2, a2, 16 srli a4, a4, 16 add a0, a2, a4 ret 执行加法a0、a2、a4后,a2和a4的值也会改变。 例如。 如果我注释掉adda0,a2,a4并执行它,结果是:a0=0x33333333,a2=a4=0x00000000。 如果我添加“添加”行,结果将变为:

我目前正在做一个关于risc-v的小项目。 问题是,在函数中,当我做这样的事情时

foo:
    ... 
    lw a3, 4(sp) 
    srli a2, a2, 16 
    srli a4, a4, 16
    add a0, a2, a4 
    ret
执行加法a0、a2、a4后,a2和a4的值也会改变。 例如。 如果我注释掉adda0,a2,a4并执行它,结果是:a0=0x33333333,a2=a4=0x00000000。 如果我添加“添加”行,结果将变为: a0=ax000063e3,a3=0x123392c8,a4=0x00000d6e,a2=0x00005675

即使它是函数的最后一条语句,它也会更改它上面的寄存器的值。(如a3)

我是不是错过了risc-v的一些东西?它不是按顺序执行的吗

在使结果变为0的函数中

...
beq a1, zero, exit_loop
...

exit_loop:
add a0, zero, zero
j finish

...
finish:
addi sp, sp, 28
ret 

但这返回0x00000001。如果我理解risc-v的基本部分,请告诉我。谢谢

这听起来不太可能。您确定寄存器在到达
add
(或其所在位置)之前具有相同的初始值吗?使用调试器单步执行
添加
。第一个代码块不是a,因为它取决于
a2
a4
的初始值。(但不是
4(sp)
处的内存,所以我想知道为什么您将该指令留在内存中)您如何测试这些asm片段?在查看寄存器值之前,我猜有什么东西正在破坏它们<代码>添加a0,零,零应生成一个
a0=0
。你确定你看到的“返回值”实际上是
a0
?听起来像是你核心中的一个bug。你用的是什么核心?在模拟器上试试你的代码,比如说RARS。你在什么环境下看到这种行为?模拟器?硬件,如果是,哪些硬件?你是如何观察它的?您的设置或配置似乎有问题。这听起来不太可能。您确定寄存器在到达
add
(或其所在位置)之前具有相同的初始值吗?使用调试器单步执行
添加
。第一个代码块不是a,因为它取决于
a2
a4
的初始值。(但不是
4(sp)
处的内存,所以我想知道为什么您将该指令留在内存中)您如何测试这些asm片段?在查看寄存器值之前,我猜有什么东西正在破坏它们<代码>添加a0,零,零应生成一个
a0=0
。你确定你看到的“返回值”实际上是
a0
?听起来像是你核心中的一个bug。你用的是什么核心?在模拟器上试试你的代码,比如说RARS。你在什么环境下看到这种行为?模拟器?硬件,如果是,哪些硬件?你是如何观察它的?您的设置或配置似乎有问题。