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

gcc:如何在函数项上保存所有使用的寄存器,gcc,interrupt,riscv,Gcc,Interrupt,Riscv,这是关于RISC-V使用的gcc,但它可能也适用于其他目标 如果我使用\uuuu属性((中断))将函数声明为ISR,gcc将自动保存并恢复ISR使用的所有寄存器。GCC还将在函数末尾生成中断指令的返回(mret),而不是常规函数返回(ret) 是否可以指示gcc像保存ISR一样保存所有使用过的寄存器,但它不生成mret指令,而是生成常规ret?gcc中没有对此的内置支持。通常,这可以通过制作一个小的trampoline存根来解决,该存根保存所有调用者保存的寄存器,然后正常调用实际函数 或者,如果

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

如果我使用
\uuuu属性((中断))
将函数声明为ISR,gcc将自动保存并恢复ISR使用的所有寄存器。GCC还将在函数末尾生成中断指令的返回(
mret
),而不是常规函数返回(
ret


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

gcc中没有对此的内置支持。通常,这可以通过制作一个小的trampoline存根来解决,该存根保存所有调用者保存的寄存器,然后正常调用实际函数

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

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

我只想保存函数中实际使用的寄存器。添加trampoline存根将必须保存所有调用方保存的寄存器,因为它不知道函数实际修改的寄存器。@dsula“只保存函数中实际使用的寄存器”-只有在函数为叶子(即不调用其他函数)的情况下才可能(否则,必须保存所有呼叫方保存的寄存器)。是的,这是您必须支付的价格。