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

陈良 原创作品转载请注明出处 《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中的寄存器不断地变化数值就是计算的过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值