注:余星光原创作品转载请注明出处《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
step1:
在Code目录下新建一个main.c文件,内容如下
int g(int x)
{
return x + 3;
}
int f(int x)
{
return g(x);
}
int main(void)
{
return f(226500) + 1;
}
然后在控制台下使用如下命令生成相应的汇编代码:
gcc -S -o main.s main.c -m32
step2:
分析汇编代码,在step1中生成的纯汇编代码(删除了不相关的代码)如下:
程序首先从main开始执行,寄存器eip指向标记main:处的第一条指令“pushl %ebp”;开始执行第一条指令。
注:“ebp 0”中的0为栈标号。
“eip(23)”中的23为汇编代码中的标号。
call f指令相当于pushl %eip和movl f %eip这两条指令,压栈时eip指向当前正在执行指令的下一条指令,其标号为23;f对应汇编的标号为8;调用call f指令后eip指向标号为8的位置,程序从eip指向的位置继续执行;
call g指令相当于pushl %eip和movl g %eip这两条指令,压栈时eip指向当前正在执行指令的下一条指令,其标号为15;g对应汇编的标号为1;调用call g指令后eip指向标号为1的位置,程序从eip指向的位置继续执行;
上面的执行完后eip指向汇编代码的标号为6;
上面的ret指令相当于popl %eip;leave指令相当于movl %ebp,%esp和popl %ebp这两条指令;eip此时指向16;
最后算的226504作为返回值。对应汇编代码在计算机中的整个执行过程就是这样。
总结:
计算机中的工作过程其实很简单,就是按指令的某个序列进行执行。从上面的描述中可以知道,首先先从main函数开始执行,当执行到函数调用的时候,保存当前上下文,然后开始执行子被调用程序;当被调用程序执行完毕时,恢复主函数上下文,继续执行主函数后面的指令。
注:余星光原创作品转载请注明出处《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

被折叠的 条评论
为什么被折叠?



