陈良 原创作品转载请注明出处 《Linux操作系统分析》MOOC课程http://www.xuetangx.com/courses/course-v1:ustcX+USTC001+_/about
1.使用vim编辑main.c文件,并使用命令: gcc -S -o main.s main.c -m32将main.c反汇编成main.s文件,并通过vim编辑main.s删除其中“."开头的行。
2.得到下图汇编文件,展开分析。
3.分析开始
注:堆栈地址是从高地址向低地址生长。
程序从main函数开始运行,eip=18,ebp指向0地址位,esp指向0地址位
pushl %ebp; 将 ebp = 0 压入堆栈,esp指向1,地址1处内容为 ebp = 0;eip = 19;
movl %esp, %ebp; 将esp的地址赋给ebp,ebp = 1;eip = 20;
subl $4, %esp; esp +1 = 2,esp指向地址2,eip = 21;
movl $11, (%esp); 将esp的内容置为11,地址2处的内容为 11;eip = 22;
call f; 等于pushl %eip;movl f,%eip;esp指向地址3,地址3处的内容为 eip = 23,eip = 8;
pushl %ebp; 将 ebp = 1 压入堆栈,esp指向地址4;
movl %esp; %ebp;将esp指向赋给ebp,ebp指向地址4;
subl $4, %esp; 将esp指向地址+1,esp指向地址5;
movl 8(%ebp),%eax; 将ebp的指向-2,并把值赋给eax ;eax = 11;
movl %eax,(%esp);将eax的值赋给esp的值,地址5的值为;
call g;eip等于15,该命令等于pushl %eip;movl g,%eip;esp指向地址6,地址6内容为eip=15,eip = 1;
。。。
popl %ebp;ebp指向4,esp指向地址6;此时eax = 34;
ret; 等于pop eip;eip = 15,esp指向地址5;
leave;等于mov ebp,esp;pop ebp;先是esp指向地址4,接着pop ebp;ebp 指向地址1,esp指向地址3.
。。。
结束。
4. 总结部分
计算机的工作原理就是cpu中的寄存器读取内存中的指令,并运行读取到的指令的工作过程,过程中cpu中的寄存器不断地变化数值就是计算的过程。