这里的参数按照学号修改
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条)