首页 > 编程 > ASM > 正文

实验1-汇编一个简单的C程序

2019-11-08 02:09:17
字体:
来源:转载
供稿:网友

实验代码

int g(int x){return x + 3;}int f(int x){return g(x);}int main(void){return f(2) + 1;}

汇编指令:gcc -S main.c

汇编结果

g: pushl %ebp movl %esp, %ebp movl 8(%ebp),%eax addl $3, %eax popl %ebp retf: pushl %ebp movl %esp, %ebp pushl 8(%ebp) call g addl $4, %esp leave retmain: pushl %ebp movl %esp, %ebp pushl $2 call f addl $4, %esp addl $1, %eax leave ret

分析:

程序从main函数开始 首先 pushl %ebp movl %esp, %ebp 相当于enter指令,保存ebp的值,然后将ebp的值设为esp,相当于保存原函数的堆栈,然后建立当前函数的堆栈,而且它还有这样的功能,见下面的博客 http://blog.csdn.net/zhangxinrun/article/details/5888425

把立即数2压栈,然后调用函数f 同样enter一下 pushl 8(%ebp),将当前ebp所指向的堆栈位置向上数两个的位置,也就是放2的那个位置,压栈。 做一个变址寻址,即将2放入累加器eax中 累加器再加3,累加器为5. 然后pop %ebp,相当于leave,由于g函数中没有额外压栈,所以没做mov指令 返回f函数, esp向上移动一个堆栈位置然后leave, 返回main 同样esp向上移动一个堆栈位置然后leave,与此同时eax加1,得到最终值6 程序结束


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选