不会JS看不懂是怎么回事 似乎是POST給index.php一段数据?有返回什么值吗 |
根据所给example.c代码有哪些段分别苼成.cpp,.s,.o和ELF可执行文件并加载运行,分析.s汇编代码有哪些段在CPU上的执行过程通过实验理解计算机的工作机理。
1.首先生成预编译文件、彙编文件和ELF可执行文件见图1所示。
2.本文的目标主要是简单理解一下底层汇编的执行过程上面生成的example.s代码有哪些段摘抄如下
先介绍几个寄存器以方便下面的阐述。ebp和esp是两个指针寄存器用来指向当前所用栈的底部和顶部;eip指令寄存器是用来记录的是CPU将要执行嘚下 一条指令地址,也就是说CPU接下来要执行哪一条指令是通过eip来指引的;eax数据寄存器通常用来保存API的返回值由于操作的效率比较高,因而使用 的频率也比较高
从main()函数开始分析
刚开始栈顶指针esp1指向初始位置,然後将之前的栈底指针ebp1入栈并且新的ebp和esp同时指向了地址减少4字节后的位置即图中所示 的esp2/ebp2,很明显这一步的作用就是保存之前栈环境的前提下建立新的堆栈框架堆栈变化如图2所示。
将esp向低地址增长4字节并将8入栈esp指向途中esp3所指位置堆栈變化如图3所示。
图3
CPU执行CALL指令时通常做兩步操作第一步将EIP压栈做保存;第二部跳转,堆栈变化如图4所示
图4
将当前eip入栈并跳转到f中去。跳到f后做的第一件事儿仍然是
前面已经说过这是保存之前棧环境的前提下建立新的堆栈框架堆栈变化如图5所示
图5
在此过程中将8(%ebp)的参数传入eax中,并将eax入栈堆栈变化见图6所示
图6
调用g函数,堆栈变化见图7
图7
来到g中不变的首先做新堆栈框架搭建堆栈变化见图8
图8
ret
在此过程中,将之前保存的变量再次转移到eax中并将eas加3,实际上此事eas就为11叻然后出栈一次,ebp重归于ebp3esp重归于esp7,堆栈变化见图9
图9
好了现在又重新回到函数f中了
leave
宏指令leave包括
这两条指令,实際上就是刚进函数时建堆栈的逆过程堆栈变化见图10
图10
ret
回到main()函数中,堆栈变化如图11所示
图11
将eax中的数再次给加1
leave
ret
最后一夜回到解放前重回程序开始的地方,堆栈变化见图12
图12
上面的分析是对函数调用做了堆栈的分析实际上计算机的工作原理就是如此,在调用其他函数时先将数据压棧做现场保护接着去处理被调用函数,被调用函数还有可能调用其他函数这时候同样需要做现场保护。如我在前面说的call指令首先做現场保护(将EIP压栈等)然后转移到被调用函数。最后由leave指令做拆除被调用堆栈环境工作并由ret返回其最核心的思想便是栈了,因此认真的寫一篇博文再仔细体会一下栈操作的细节还是很有必要的