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

来源:互联网 发布:王天一网络象棋直播 编辑:程序博客网 时间:2024/05/22 00:34

软件平台: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,%eax0x00401342  leave0x00401343  ret

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

0x00401344  push   %ebp0x00401345  mov    %esp,%ebp0x00401347  mov    0xc(%ebp),%eax0x0040134A  add    0x8(%ebp),%eax0x0040134D  pop    %ebp0x0040134E  ret

void print():汇编代码

0x0040134F  push   %ebp0x00401350  mov    %esp,%ebp0x00401352  sub    $0x4,%esp0x00401355  movl   $0x0,-0x4(%ebp)0x0040135C  leave0x0040135D  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;
函数返回到原函数继续执行

0 0
原创粉丝点击