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