上述汇编代码对应3个函数:main函数,f函数和g函数:
- 首先执行的是main函数
代码 | 含义 |
---|---|
pushl %ebp | 把EBP寄存器也即栈基指针的值压栈 |
movl %esp, %ebp | 保存栈基指针的内容,然后把栈顶指针拷贝给栈基指针 |
subl ,%esp | 栈顶指针下以4个单位,分配一个单元 |
movl , (%esp) | 将数值28存储到刚刚分配的个单元 |
call f | 调用f函数 |
add ,%eax | 将数值19放到压栈前栈基指针的下一位置 |
leave | 撤销执行main函数建立的堆栈 |
ret | 函数返回 |
- 再来看f函数:
代码 | 含义 |
---|---|
pushl %ebp | 把EBP寄存器也即栈基指针的值压栈 |
movl %esp, %ebp | 保存栈基指针的内容,然后把栈顶指针拷贝给栈基指针 |
subl ,%esp | 栈顶指针下以4个单位,分配一个单元 |
movl 8(%ebp), %eax | 栈基指针的内容加上8对应的存储单元的内容传送给累加寄存器EAX |
movl %eax,( %esp) | 把EAX内容拷贝给栈顶指针所指的位置 |
call g | 调用g函数 |
leave | 撤销执行main函数建立的堆栈 |
ret | 函数返回 |
- 最后来看g函数
代码 | 含义 |
---|---|
pushl %ebp | 把EBP寄存器也即栈基指针的值压栈 |
movl %esp, %ebp | 保存栈基指针的内容,然后把栈顶指针拷贝给栈基指针 |
movl 8(%ebp), %eax | 栈基指针的内容加上8对应的存储单元的内容传送给累加寄存器EAX |
addl 19,%eax | 把数值2819添加到EAX寄存器里,EAX寄存器里值为2847 |
pool %ebp | 恢复函数f的函数调用栈基指针 |
ret | 函数返回 |
本次实验的目的主要是通过汇编一个简单的C语言程序并分析其汇编指令执行过程来理解“计算机究竟是如何工作的”。
通过实验楼的自带系统,我们不难发现,在指令执行过程中,很重要的一个寄存器就是EIP指令指针寄存器,它会自动地指向下一条要执行的指令地址。
与此同时,为了实现C语言,计算机会进行堆栈 *** 作,而在这一过程中非常重要的两个寄存器就是EBP基址指针寄存器和ESP栈顶指针寄存器,所有出栈入栈的 *** 作都要靠它们来完成。
汇编语言是和机器语言类似的语言,能充分体现出计算机执行指令的逻辑。计算机先将程序编译成计算机能读懂的语言,再一条条取指令来执行,直至指令执行完毕。
.本周通过学习计算机汇编的基础知识和基本原理,理解到了计算机的基本原理存储程序和程序控制,实验过程相对简单,但是需要理解的地方的还是有很多,最重要的是学会思考方式,学会从计算机的角度去看懂汇编语言,为Linux的学习添砖加瓦。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)