理解x86-64汇编代码

时间:2016-11-30 06:15:22

标签: c assembly x86-64 att

我正在尝试了解汇编代码。我被困在指定指针的部分和leaq命令

之后的代码中

这是我的C代码:

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

int main(){
    int x=50;
    int *y=&x;
    return 0;
}

这是我相应的ASSEMBLY代码:

.file   "AssemlyCode.c"
    .def    __main; .scl    2;  .type   32; .endef
    .text
    .globl  main
    .def    main;   .scl    2;  .type   32; .endef
    .seh_proc   main
main:
    pushq   %rbp
    .seh_pushreg    %rbp
    movq    %rsp, %rbp
    .seh_setframe   %rbp, 0
    subq    $48, %rsp
    .seh_stackalloc 48
    .seh_endprologue
    call    __main
    movl    $50, -12(%rbp)
    leaq    -12(%rbp), %rax
    movq    %rax, -8(%rbp)
    movl    $0, %eax
    addq    $48, %rsp
    popq    %rbp
    ret
    .seh_endproc
    .ident  "GCC: (GNU) 5.4.0"

1 个答案:

答案 0 :(得分:6)

    leaq    -8(%rbp), %rax
    movl    %eax, -4(%rbp)
    movl    $0, %eax
    addq    $48, %rsp
    popq    %rbp
    ret
  1. leaq在堆栈上保存变量x的地址以注册rax。变量x是堆栈上的自动变量,因此它的地址计算为保存堆栈帧指针(rbp)的寄存器的偏移量。

  2. movl eax堆栈将argc参数保存到堆栈。

  3. 下一步是将eax函数中的返回值放入main函数(返回0)

  4. 两个下一个操作码是函数结尾 - 你正在清理使用过的堆栈并恢复前一帧指针寄存器。

  5. 最后一条指令是简单的返回。