Gcc 在内联汇编代码中保存和恢复寄存器

Gcc 在内联汇编代码中保存和恢复寄存器,gcc,inline-assembly,Gcc,Inline Assembly,我在为操作系统任务编写内联汇编代码。我有一些关于内联汇编和gcc编译器将其翻译成机器代码的问题 asm将输入和输出绑定到寄存器。我们是否需要在使用asm执行任何操作之前保存所有寄存器,并在操作后恢复它们?因为如果绑定寄存器恰好是程序中包含重要值的寄存器,则可能会丢失该值,并且程序可能不会以预期方式运行 如何决定哪个寄存器将绑定到哪个输入 asm是否保存用于输入、输出和恢复的寄存器 他们自己 编辑:示例代码如下所示。哪个寄存器是上界的? 无符号长顶; asm易失性(“mov%0,%%rsp :

我在为操作系统任务编写内联汇编代码。我有一些关于内联汇编和gcc编译器将其翻译成机器代码的问题

  • asm将输入和输出绑定到寄存器。我们是否需要在使用asm执行任何操作之前保存所有寄存器,并在操作后恢复它们?因为如果绑定寄存器恰好是程序中包含重要值的寄存器,则可能会丢失该值,并且程序可能不会以预期方式运行
  • 如何决定哪个寄存器将绑定到哪个输入
  • asm是否保存用于输入、输出和恢复的寄存器 他们自己
  • 编辑:示例代码如下所示。哪个寄存器是上界的?
    
    无符号长顶;
    asm易失性(“mov%0,%%rsp
    :
    :“r”(顶部)
    
    :“记忆”)

    编译器有一个复杂的寄存器分配策略,它用于内联asm,就像它用于自己生成的代码一样。它可以为满足约束的asm参数使用任何寄存器或其他位置,因此很难预测可能使用哪些寄存器,并且它高度依赖于周围的代码


    编译器通过将编译后的代码所需的其他值放入其他寄存器或溢出到内存中来确保它们被保留。程序员不必担心这一点。

    “asm volatile将输入和输出绑定到寄存器”嗯。。。1)Volatile并不是你认为它的意思。花一分钟阅读关于内联asm的gcc。2) 如果(出于某种原因)必须将特定寄存器绑定到输入/输出,请查看x86或。除了这些寄存器外,无法保证将使用哪些寄存器。3) 如果您的约束条件表明您将使用寄存器,gcc将使其可用。@prl是的,当然。你的问题之所以令人困惑,是因为你似乎专注于“不稳定”,而这实际上与你的问题毫无关系。我已经编辑了这个问题。关于示例代码的注释:在内联汇编代码中更改RSP几乎是不可能的。在不通知编译器的情况下更改任何寄存器是很少见的。使用内联汇编执行“mov”指令很少有用。