您的位置:首页 > 理论基础

【汇编】计算机是如何工作的

2015-03-08 23:06 232 查看
李景源 原创作品 转载请注明出处
《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

一、编写一个main.c文件,保存并退出。



二、比较重要的几条汇编指令

pushl %eax subl $4,%esp movl %eax, (%esp)
popl %eax movl (%esp), %eax addl $4,%esp
call 0x12345 pushl %eip(*) movl $0x12345,%eip(*)
ret popl %eip(*)leave movl %ebp, %esp popl %ebp

三、反汇编C语言程序



四、 打开后的页面如下:


五、去掉所有以点开头后的内容,留下纯汇编代码:



六、汇编代码运行过程刚开始是空的堆栈



第一条指令(18行),从main函数开始执行,所以第一条指令是 push %ebp:




第二条指令(19行),ebp指向esp的位置:




第三条指令(20行),esp向下移动一个单位:



第四条指令(21行),将值放到esp所指向的内存中:



第五条指令(22行),eip压入栈,调用f函数(eip指向f):



第六条指令(9行),将ebp的值压入栈:



第七条指令(10行),ebp指向esp的位置:




第八条指令(11行),esp指向下一个位置:




第九条指令(12行),ebp向上两个单位寻址将值存入eax寄存器(其实就是第二格的2);
第十条指令(13行),将eax寄存器的值放入esp当前指向的内存:



第十一条指令(14行),调用g函数:




第十二条指令(2行),将当前ebp的的值压入栈:




第十三条指令(3行),将ebp指向esp指向的位置:



第十四条指令(4行),ebp向上两个单位寻址将值存入eax寄存器(其实就是第五格的2);
第十五条指令(5行),eax的值加5再存入eax中,eax=5+2=7;

第十六条指令(6行),pop将ebp重新指向原来的位置(4):





第十七条指令(7行),esp指向上一格位置,同时eip指向14行:




第十八条指令(15行),esp指向ebp所指向的位置,之后ebp指向原来的位置,esp指向上一格位置:



第十九条指令(16行),esp指向上一格位置,同时eip指向22行:



第二十条指令(23行),将eax的值加上20再存入eax;
第二十一条指令(24行),将esp指向ebp所指向的位置,之后ebp指向原来位置(0),esp指向上一格位置:



第二十二条指令(25行),结束函数。

七、计算机是如何工作的?
从上面的例子看来,计算机有不断的“下一步”,即使所谓的结束也只是返回到另一种状态。同时,每一个“下一步”又是非常明确的。所以计算机就像是一个“工作狂”,你不断地塞任务给它,它会排列成一个队列,然后一步步地去执行。

本文出自 “sr5220” 博客,请务必保留此出处http://sr5220.blog.51cto.com/5282574/1618436
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐