一.AI学习
二、完成实验楼实验
1)创建文件并编写程序
2)把.c文件编译成一个汇编代码(.s文件),使用如下命令:
gcc –S –o main.s main.c -m32
3)输入g/\.s*/d可以删除所有以“.”打头的字符串,获得“干净”的汇编代码。
三、分析汇编代码
(1)汇编代码分别对应3个函数:main函数、f函数、g函数。
(2)四个寄存器及其作用:
ebp:堆栈基指针,该指针永远指向系统栈最上面一个栈帧的底部。
esp:堆栈底指针,永远指向系统栈最上面一个栈帧的顶部。
eip:指令指针。
eax:累加寄存器。
(3)步骤分析
1、程序从main函数开始执行也就是从第十八行开始执行
2、pushl %ebp:把EBP寄存器的值压栈
3、movl %esp,%edp:将EBP寄存器指向标号1的位置
4、subl $4,%esp:把ESP寄存器-4,实际上ESP向下移动一个标号,指向2的位置
5、movl $9,(%esp):把数9放入ESP寄存器指向的标号2的位置
6、call f:跳转到函数 f,并且执行
7、movl %esp,%edp:初始化函数自己的函数调用堆栈空间。
8、subl $4,%esp:ESP-4指向下一个位置栈空间的标号5
9、movl 8,(%esp),%eax:把立即数8放到EAX寄存器中。
10、movl %eax,(%esp):把EAX寄存器中存储的立即数8放到ESP寄存器现在所指的位置5.
11、call g:跳转到函数 g,并且执行
12、movl %esp,%edp:初始化函数自己的函数调用堆栈空间。
13、movl 8(%ebp),%eax
14、addl $42,%eax
14、popl %ebp