繁体   English   中英

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

[英]x86_64 assembly conventions saving argument registers

我正在编写一些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页的表。它为所有寄存器提供了一个“保留是/否”列。 它对用于传递参数的所有寄存器都说“不”。

无论是否传递参数,都不需要保留参数寄存器。 你可能不会得到你的参数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM