分析一个简单C程序的汇编代码,理解计算机是如何工作的

注:余星光原创作品转载请注明出处《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


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值