我正在编写一些 x86_64 程序集来调用 C 函数。我的 C 函数接受 1 个参数,因此程序集将参数放置在 %rdi
中。 ABI pdf(链接如下)表示其他 6 个参数寄存器(rsi、rdx、rcx、r8、r9)不会在函数调用之间保留。但是,由于我的 C 函数仅采用一个 long
参数,因此我能否保证该 C 函数是否会破坏其他 5 个寄存器?我的假设是,参数寄存器仅在参数值更改时才会被破坏:
void foo(int a, int b) {
a++; /* %rdi will be changed, but %rsi won't be changed when control returns. */
}
我这么问是因为我想在我的 C 函数调用中保留其他 5 个参数寄存器的值(而不必手动从堆栈中显式插入/弹出它们)。
x86_64 ABI - http://www.x86-64.org/documentation/abi-0.99.pdf
最佳答案
没有任何保证。您必须将它们保存在堆栈中以确保它们不被更改。它们是否改变将取决于编译器。
如果您想以某种方式确保它们不被更改,您可以在汇编中编写该函数。
关于c - x86_64 汇编约定保存参数寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12224188/