了解x86-64汇编代码中的指针赋值

Bra*_*eel 1 c assembly x86-64 att

我想了解汇编代码.我被困在指定指针的部分和leaq命令后的代码中

这是我的C代码:

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

int main(){
    int x=50;
    int *y=&x;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是我相应的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"
Run Code Online (Sandbox Code Playgroud)

use*_*854 6

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

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

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

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

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