Assembly RISC-V:a0操作改变其他寄存器值
我目前正在做一个关于risc-v的小项目。 问题是,在函数中,当我做这样的事情时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。 如果我添加“添加”行,结果将变为:
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。你在什么环境下看到这种行为?模拟器?硬件,如果是,哪些硬件?你是如何观察它的?您的设置或配置似乎有问题。