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)
leaq -8(%rbp), %rax
movl %eax, -4(%rbp)
movl $0, %eax
addq $48, %rsp
popq %rbp
ret
Run Code Online (Sandbox Code Playgroud)
leaq保存x堆栈上的变量地址以进行注册rax.变量x是堆栈上的自动变量,因此它的地址计算为保存堆栈帧指针(rbp)的寄存器的偏移量.
movl eax堆栈保存argc参数到堆栈.
下一步是将函数中的返回值放入eax寄存器中main(返回0)
两个下一个操作码是函数结尾 - 你正在清理使用过的堆栈并恢复前一帧指针寄存器.
最后一条指令是简单的返回.