原创作品 转载请注明出


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

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

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

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语言程序

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

四、 打开后的页面如下:【汇编】计算机是如何工作的_汇编_03

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

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

六、汇编代码运行过程

刚开始是空的堆栈

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

第十条指令(13行),将eax寄存器的值放入esp当前指向的内存:

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

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

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

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

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

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

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

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

第十五条指令(5行),eax的值加5再存入eax中,eax=5+2=7;

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

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


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

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

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

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

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

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

第二十条指令(23行),将eax的值加上20再存入eax;

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

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

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


七、计算机是如何工作的?

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