我正在编写一些 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