2

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

4

2 回答 2

8

没有任何保证。您必须将它们保存在堆栈中以确保它们不会被更改。它们是否被改变将取决于编译器。

如果你想以某种方式确保它们不会被改变,你可以在汇编中编写函数。

于 2012-09-01T01:34:05.020 回答
6

查看第 21 页上的表格。所有寄存器都有一个“保留是/否”列。它对所有用于传递参数的寄存器都说“否”。

无论您是否传递参数,都不需要保留参数寄存器。您可能无法取回您的参数。

于 2012-09-01T10:14:01.320 回答