实验1:反汇编一个简单程序
1.通过如下图所示命令创建mian.c文件
2通过在mian.c文件中输入如下程序
3.执行反汇编命令gcc –S –o mian.s mian.c
得到mian.s文件
4.通过命令g/\.s*/d
得到一下代码
5.通过对反汇编代码分析可知
g 函数:
pushq %rbp:将当前函数的栈帧基址指针(%rbp)的值推入堆栈,保存了之前的栈帧的基址。
movq %rsp, %rbp:将当前栈顶指针(%rsp)的值复制到栈帧基址指针(%rbp),建立了一个新的栈帧。
movl %edi, -4(%rbp):将传入的参数 %edi 的值保存到当前栈帧的相对地址为 -4(%rbp) 的位置上,这是局部变量的存储位置。
movl -4(%rbp), %eax:将局部变量的值加载到 %eax 寄存器中。
addl $1, %eax:将 %eax 中的值加1,然后保存回 %eax。
popq %rbp:将之前保存的栈帧基址指针恢复,恢复之前的栈帧。
ret:从函数返回,弹出调用栈并跳回到调用者。
f 函数:
pushq %rbp:保存调用者的栈帧基址指针。
movq %rsp, %rbp:建立新的栈帧。
subq $8, %rsp:分配8个字节的空间,用于局部变量或临时数据的存储。
movl %edi, -4(%rbp):将传入的参数 %edi 的值保存到当前栈帧的局部变量中。
movl -4(%rbp), %eax:将局部变量的值加载到 %eax 寄存器中。
movl %eax, %edi:将 %eax 中的值复制给 %edi 寄存器,这是用于调用 g 函数的参数。
call g:调用 g 函数。
leave:释放当前函数的栈帧,等效于 movq %rbp, %rsp 以及 popq %rbp。
ret:从函数返回。
main 函数:
pushq %rbp:保存调用者的栈帧基址指针。
movq %rsp, %rbp:建立新的栈帧。
movl $101, %edi:将立即数 101 作为参数加载到 %edi 寄存器中。
call f:调用 f 函数。
addl $2, %eax:将 %eax 中的值加2,这是函数 f 的返回值。
popq %rbp:恢复调用者的栈帧基址指针。
ret:从 main 函数返回。