【汇编】计算机是如何工作的
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
《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
相关文章推荐
- (作业1)将一个简单的C程序编译成汇编代码,讨论计算机是如何工作的进行
- 分析一个简单C程序的汇编代码,理解计算机是如何工作的
- linux内核分析作业:以一简单C程序为例,分析汇编代码理解计算机如何工作
- 反汇编程序分析计算机是如何工作的
- 通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的--20135334赵阳林
- 通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
- 《Linux内核分析》MOOC课程之从汇编语言角度看计算机是如何工作的
- Linux内核分析第一周-通过分析汇编代码理解计算机是如何工作的
- 通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
- 计算机是如何工作的——汇编代码分析
- 第一次作业 图解汇编代码以及分析计算机是如何工作的
- 通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
- 通过分析汇编代码了解计算机是如何工作
- 通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
- 云课堂 Linux内核分析 通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
- 通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的(原创)
- 通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
- 反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
- 通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
- 通过分析汇编代码理解计算机如何工作