我正在尝试了解汇编代码。我被困在指定指针的部分和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"
答案 0 :(得分:6)
leaq -8(%rbp), %rax
movl %eax, -4(%rbp)
movl $0, %eax
addq $48, %rsp
popq %rbp
ret
leaq
在堆栈上保存变量x
的地址以注册rax
。变量x
是堆栈上的自动变量,因此它的地址计算为保存堆栈帧指针(rbp
)的寄存器的偏移量。
movl eax
堆栈将argc
参数保存到堆栈。
下一步是将eax
函数中的返回值放入main
函数(返回0)
两个下一个操作码是函数结尾 - 你正在清理使用过的堆栈并恢复前一帧指针寄存器。
最后一条指令是简单的返回。