gcc:如何在函数入口上保存所有使用的寄存器

gcc: how to save all used register on function entry

这是关于用于 RISC-V 的 gcc,但它可能也适用于其他目标。

如果我使用 __attribute__((interrupt)) 将函数声明为 ISR,gcc 会自动保存和恢复 ISR 使用的所有寄存器。 GCC 还将在函数末尾生成 return-from-interrupt 指令 (mret) 而不是常规函数 return (ret).

是否可以指示 gcc 像使用 ISR 一样保存所有使用的寄存器,而不是生成 mret 指令,它应该生成常规 ret?

GCC 对此没有内置支持。通常这是通过制作一个小的蹦床存根来解决的,它保存所有调用者保存的寄存器,然后正常调用真正的函数。

或者,如果唯一需要的更改是将 mret 替换为 ret,您可以简单地后处理生成的汇编代码:

$ gcc file.c -S -o file.s
$ sed -i -e 's/\bmret\b/ret/'