c-x86_64程序集约定保存参数寄存器



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

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

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

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

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

最新更新