RISC v函数调用约定、寄存器传参

您好,我这边有一个关于函数传参的问题,代码如下:

_User_Enter(0x8010021U,0x2001FFF0,0U);//我想进入用户模式,第一个参数为入口地址,该函数用汇编实现
//我在测试,所以暂时未用到第二第三个参数

_User_Enter:

li t0, 0x00001800

csrc mstatus, t0

la t0, 1f

csrw mepc, t0

mret

1:

jr a0

将mstatus寄存器MPP位设为用户模式后,转到a0地址,也就是进入我的用户态代码。在这段代码中,a0寄存器是不是应该保存我的函数的第一个参数0x8010021。但是在单步调试下,我发现a0和我预想的并不一样。

在刚进入_User_Enter:这个函数时,a0,a1,a2,三个寄存器分别为0x8010021,0x2001FFF0,0,确实是函数传入的参数,但是一旦运行完我上边汇编代码的第一行,a0寄存器的内容就会突然变化,变成0xe000 0000,附调试图。

a0寄存器的变化和我汇编代码没有关系,我试了一下不同的写法,甚至只写一行任意的汇编代码,只要开始运行,a0寄存器的内容就会变为0xe000 0000,感到十分奇怪。我也尝试了传入不同的参数,仍然会发生相同的结果。

请问我在哪里出了问题,期待答复,十分感谢!

1685323046464464.png

1685323051111234.png


您好,这边在MRS185版本试验了一下,没有复现。如下图所示,您可以用最新版本按照下图中的方式来使用。

image.png


只有登录才能回复,可以选择微信账号登录