在嵌入式汇编代码中保存和恢复寄存器

时间:2018-10-19 13:25:14

标签: gcc inline-assembly

我正在为操作系统分配编写内联汇编代码。我对内联汇编以及gcc编译器将其转换为机器代码有一些疑问。

  1. asm将输入和输出绑定到寄存器。在使用asm进行任何操作之前,我们是否需要保存所有寄存器,并在操作后将其还原回去?因为如果绑定寄存器恰好是程序中包含重要值的寄存器,则可能会丢失该值,并且程序可能无法以预期的方式运行。
  2. 如何确定将哪个寄存器绑定到哪个输入?
  3. asm是否保存用于输入,输出和还原的寄存器 他们自己吗?

编辑:示例代码如下。哪个寄存器是最高绑定的? unsigned long long top; asm volatile("mov %0, %%rsp;" : :"r"(top) :"memory");

1 个答案:

答案 0 :(得分:1)

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

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

相关问题