c语言反编译为汇编语言,C语言的反汇编代码(BP,SP的关系)

本文介绍了如何将C语言代码反编译为汇编语言,通过分析简单示例代码的反汇编结果,揭示了栈帧的创建过程,包括ESP和EBP寄存器的变化,以及函数调用中参数传递和局部变量的存储方式。通过对不同函数调用场景的探讨,阐述了栈中局部变量的分配、释放和访问规则,有助于深入理解C语言与汇编之间的关系。
摘要由CSDN通过智能技术生成

1.最简单的代码:

test1.c

int main(){

return 1;

}

编译、反汇编:

gcc test1.c

gdb ./a.out

(gdb) disassemble main

0x08048344 :lea0x4(%esp),%ecx;取出esp寄存器里的值,加上4,将得到值传递给ecx;

0x08048348 :and$0xfffffff0,%esp;使栈地址16字节对齐

0x0804834b :pushl-0x4(%ecx);取出寄存器ecx的值,减去4,即esp的值,将得到的值作为地址,在内存找到该地址对应的值,将其压入栈中。

0x0804834e :push%ebp

0x0804834f :mov%esp,%ebp ;创建Stack Frame(栈框架)

0x08048351 :push%ecx

0x08048352 :mov$0x1,%eax

0x08048357 :pop%ecx

0x08048358 :pop%ebp

0x08048359 :lea-0x4(%ecx),%esp;取出ecx寄存器里的值,减去4,将得到值传递给esp;还原esp的值

0x0804835c :ret

常用指令解释:

CALL指令:

用来调用一个函数或过程,此时,下一条指令地址会被压入堆栈,以备返回时能恢复执行下条指令。RET指令:

用来从一个函数或过程返回,之前CALL保存的下条指令地址会从栈内弹出到EIP寄存器中,程序转到CALL之前下条指令处执行

ENTER指令:

建立当前函数的栈框架,即相当于以下两条指令:pushl   %ebp

movl    %esp,%ebp

LEAVE指令:

释放当前函数或者过程的栈框架,即相当于以下两条指令:movl ebp esp

popl ebp

2.函数间的调用代码:

假如函数A调用函数B,函数B调用函数C:

/ test2.c

void c(){}

void b(){c();}

void a(){b();}

int main(){

a

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值