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


李景源 原创作品 转载请注明出

《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000


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

wKioL1T8Yvyx65zGAAI4LFGTe_c048.jpg

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

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

wKioL1T8YzHD9dbkAAGkLiSDlkg537.jpg

四、 打开后的页面如下:wKiom1T8YpOyIXprAAKRnEVlO60087.jpg

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

wKiom1T8Y5DiTeElAAJ0XSgPGDo113.jpg

六、汇编代码运行过程

刚开始是空的堆栈

wKioL1T_CvTz8AACAABF0nPiDS0659.jpg

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

wKiom1T_CyDwP5ZYAAB0Rc6PyHo382.jpg


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

wKioL1T_DNaALr6wAAB1my0p48M037.jpg

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

wKiom1T_DAWxDUtiAAB6RnuihLI708.jpg

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

wKiom1T_DJqzjxZ1AAB4FukHyeA462.jpg

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

wKiom1T_DWyBdFc1AAB_EOmBviI703.jpg

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

wKioL1T_D2Og0oB6AACIMpc65Og744.jpg

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

wKioL1T_D7rTiF0xAACQ5b49wa4064.jpg

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

wKiom1T_Dt3jJD5kAACGN6CVJkI788.jpg

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

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

wKioL1T_EOHDR55VAACuy4eiyoc457.jpg

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

wKioL1T_EaGQO4PxAACl_wlG30Y363.jpg

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

wKiom1T_ENWhuiZdAADJjlrQI1U203.jpg

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

wKiom1T_ETzRupYpAADBlHtqRpE360.jpg

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

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

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

wKioL1T_E8LTDwqgAADA3CP-5PM943.jpg


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

wKioL1T_FEyDNqTHAACuCf3BaN8374.jpg

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

wKioL1T_FfqxywsrAACuE7Hvu40118.jpg

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

wKiom1T_FYyjjgMSAAC6xMJoOmQ973.jpg

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

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

wKioL1T_F2yR4Aw8AAC64FZ2KSY719.jpg

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


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

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


你可能感兴趣的:(linux,汇编,计算机)