c++ - RISC-V 寄存器在系统调用期间被替换
问题描述
内联汇编系统调用的浮点返回值被编译器意外保存,然后在调用后恢复。
inline float fsyscallf(long n, float farg0)
{
register long a0 asm("a0");
register float fa0 asm("fa0") = farg0;
register long syscall_id asm("a7") = n;
asm volatile ("scall"
: "=r"(a0), "+r"(fa0) : "r"(syscall_id));
return fa0;
}
从 FA0 返回浮点值的系统调用。
syscall.hpp:149
101fc: e00507d3 fmv.x.w a5,fa0
10200: 00000073 ecall
10204: f0078553 fmv.w.x fa0,a5
编译器在系统调用期间保存和恢复FA0。我在这里做错了什么?
解决方案
约束r
意味着一个通用寄存器,但是你需要fa0
,它是一个浮点寄存器,所以使用f
它作为约束。更改"+r"
为"+f"
。
推荐阅读
- python - 打印带有字典/列表的字符串时,如何防止括号和引号被打印出来?
- c++ - 蓝图不影响其父级 - 虚幻引擎
- django - 如果有多个值,则在 .values_list 时排除对象
- angular - node_modules/rxjs/internal/types.d.ts 中的角度错误
- c# - 如何反序列化具有来自不同类的对象的 JSON 字符串?
- r - 替换高频数据中的值
- python - Google Cloud Run - 如何设置“Access-Control-Allow-Origin”标头?
- python - QScintilla 中的 Pygments
- jenkins - 如何在不掩盖 withCredentials.usernamePassword 中的 PASSWORD 的情况下重用 Jenkins 凭据?
- python - 使用类将整数列出为字符串