函数调用过程-汇编代码分析

软件平台:code::block+Mingw
C源码

main.c

int add(int a,int b);
void print();
int main()
{
    int a=0;
    a=add(1,2)
    print();
    return 0;
}
int add(int a,int b){
    return a+b;
}
void print()
{
    int a=0;
}
汇编代码

main() 主要汇编代码

0x0040131A  movl   $0x0,-0x4(%ebp)
0x00401321  movl   $0x2,0x4(%esp)
0x00401329  movl   $0x1,(%esp)
0x00401330  call   0x401344 <add>
0x00401335  mov    %eax,-0x4(%ebp)
0x00401338  call   0x40134f <print>
0x0040133D  mov    $0x0,%eax
0x00401342  leave
0x00401343  ret

int add(int a,int b):汇编代码

0x00401344  push   %ebp
0x00401345  mov    %esp,%ebp
0x00401347  mov    0xc(%ebp),%eax
0x0040134A  add    0x8(%ebp),%eax
0x0040134D  pop    %ebp
0x0040134E  ret

void print():汇编代码

0x0040134F  push   %ebp
0x00401350  mov    %esp,%ebp
0x00401352  sub    $0x4,%esp
0x00401355  movl   $0x0,-0x4(%ebp)
0x0040135C  leave
0x0040135D  ret
关键汇编代码

(1)call addr ;命令相当于 push eip ;jmp addr;
将当前eip保存到栈中,跳转到目的地址
(2)push %ebp;mov %esp,%ebp;
函数开头固定格式,将栈底指针保存到栈中,再把栈底指针设置为当前栈顶指针
(3)leave ;相当于pop %ebp;
函数结束后,还原栈顶指针,void返回值类型函数 用leave;
int返回值类型函数 用pop %ebp;
(4)ret;相当于 pop %eip;
函数返回到原函数继续执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值