
这里的参数按照学号修改
2.对所生成的main.c进行编译,得到main.s文件使用
对其带“.”的辅助信息进行消除得到下面纯净的汇编代码
3.汇编语句分析首先分析最先执行的main代码:
| pushl %ebp | 把EBP寄存器也即栈基指针的值压栈 |
| movl %esp,%ebp | 保存栈基指针的内容,然后把栈顶指针拷贝给栈基指针 |
| subl ,%esp | 栈顶指针下以4个单位,分配一个单元 |
| movl , (%esp) | 将数值28存储到刚刚分配的个单元 |
| call f | 调用f函数 |
| add ,%eax | 将数值9放到压栈前栈基指针的下一位置 |
| leave | 撤销执行main函数建立的堆栈 |
| ret | 函数返回 |
然后是f函数:
| pushl %ebp | EBP寄存器的值压栈 |
| movl %esp, %ebp | 保存栈基指针的内容,然后把栈顶指针拷贝给栈基指针 |
| subl ,%esp | 栈顶指针下以4个单位,分配一个单元 |
| movl 8(%ebp), %eax | EBP寄存器加8 |
| movl %eax,( %esp) | 将EAX寄存器中存储的立即数8放到ESP寄存器现在所指位置上 |
| call g | 调用函数g |
| leave | 撤销执行main函数建立的堆栈 |
| ret | 函数返回 |
最后是g函数:
| pushl %ebp | EBP寄存器的值压栈 |
| movl %esp, %ebp | 保存栈基指针的内容,然后把栈顶指针拷贝给栈基指针 |
| movl 8(%ebp), %eax | EBP寄存器加8,指向标号5的位置,将标号5的内容放到EAX寄存器中 |
| addl 09,%eax | 把立即数2809加到EAX寄存器中 |
| pool %ebp | 恢复函数f的函数调用栈基指针 |
| ret | 函数返回 |
关于寄存器
这次实验在虚拟机中编写了一个简单地C语言代码,并且将它转换成汇编语句,分析汇编语句执行的过程来进一步了解计算机时如何工作的。通过汇编语言来接近机器语言,充分体会计算机在执行过程中所执行的的最“朴素”的语言。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)