C到汇编调用约定32位对64位

Cbs*_*sch 10 c linux x86 assembly x86-64

我一直在关注优秀的编程基础,希望学习装配.虽然现在不在书中,但是我想在32位机器上调用我的汇编函数,这在本书的工作中是有效的.

我在这里做的是存储第一个参数%ebx和第二个参数%ecx.

.type power, @function
.globl power
power:
    pushq   %ebp
    movl    %esp, %ebp
    subl    $4, %esp

    movl    8(%ebp), %ebx
    movl    12(%ebp), %ecx
Run Code Online (Sandbox Code Playgroud)

我将这个(以及函数的其余部分)编译成一个目标文件,创建一个main.c,在那里我对函数进行原型化并调用它,如下所示:

int power(int b, int x);
int a = power(2, 1);
Run Code Online (Sandbox Code Playgroud)

但是,当我在64位机器上编译它时,我得到一些非常意外的结果.我修改了明显的,喜欢的事实,%esp%epb需要更换与%rsp%rpb,但与GDB挖掘显示,参数是无处栈上找到!

通过使用-SGCC选项检查发生了什么我可以看到,GCC不是在堆栈上推送变量,而是将参数存储在寄存器中.

 movl $1, %esi
 movl $2, %edi
 call power
Run Code Online (Sandbox Code Playgroud)

在32位机器上,它完成我所期望的并推送堆栈上的参数:

 movl $1, 4(%esp)
 movl $2, (%esp)
 call power
Run Code Online (Sandbox Code Playgroud)

现在发生了什么事?为什么GCC在64位寄存器和32位堆栈上传递参数?这非常令人困惑!在任何地方我都找不到任何提及.有没有人可以在这种情况下启发我?

Ale*_*x F 28

64位C调用约定是:%rdi,%rsi,%rdx,%rcx,%r8和%r9

请参阅此处的完整描述: "System V Application Binary Interface:AMD64 Architecture Processor Supplement"http://www.x86-64.org/documentation/abi.pdf

3.2函数调用序列

当我学习相同的主题时,我制作了具有所需功能的小型C程序,用64位编译器编译它们并读取C编译器生成的汇编代码.C/C++编译器可以像汇编参考一样使用.

  • 作为一个注释,Windows使用不同的ABI - http://msdn.microsoft.com/en-us/library/ms235286.aspx与RCX,RDX,R8,R9作为参数. (10认同)