c - x86_64 汇编约定保存参数寄存器

标签 c assembly 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

最佳答案

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

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

关于c - x86_64 汇编约定保存参数寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12224188/

相关文章:

c++ - UInt8 和 uint8_t 有什么区别

windows - 如何静态获取Windows系统调用程序集?

c - 从函数返回一对项目

c - 这个 128 位整数乘法在汇编 (x86-64) 中如何工作?

x86 - 使用Intel AVX从压缩 double 向量存储单个 double

linux - 在编译时启用 AVX512 支持会显着降低性能

C99 引用内联函数 : undefined reference to XXX and why should I put it to header?

c++ - 在 C++ 中用枚举类型包装 C-API

c - 找到一条到达叶子的路径等于sum(不是BST)

assembly - 如何反汇编movb指令