在x86-64程序集中传递的参数?

时间:2017-02-27 17:28:12

标签: c assembly x86 x86-64 disassembly

我正在学习x86-64汇编,让我感到困惑的一件事就是论证传递。从我已经理解到现在为止,在正常函数调用的情况下,参数被callie函数推送到堆栈上,并且被调用函数通过来自基指针的偏移量来访问。如果是系统调用,则通过使用传递参数rdi,rsi等寄存器,但是当我尝试查看以下代码片段的汇编代码时

#include <stdio.h>
#include <stdlib.h>


int by12(int);
int main(void)
{

    int x =  2;
    int y =  by12(x);
    printf("%d\n",y);
    return 0;
}


int by12(int a)
{
    return a*12;
}

然后装配结果

by12:
.LFB39:
    .cfi_startproc
    leal    (%rdi,%rdi,2), %edx
    leal    0(,%rdx,4), %eax
    ret

main:
.LFB38:
    .cfi_startproc
    subq    $8, %rsp
    .cfi_def_cfa_offset 16
    movl    $2, %edi
    call    by12
    movl    %eax, %edx
    movl    $.LC0, %esi
    movl    $1, %edi
    movl    $0, %eax
    call    __printf_chk
    movl    $0, %eax
    addq    $8, %rsp

我无法理解为什么生成的汇编代码使用rdi寄存器而不是使用堆栈基址偏移? 编辑 - 我在这个answer

中看到了基于堆栈的方法

0 个答案:

没有答案