刚看到ESP寻址和EBP寻址,个人理解其实2个寻址都是差不多的,都是利用偏移量来获取参数,一个搞懂另一个也明白了。只要记住ESP寻址有缺陷就OK了,缺陷就是在函数中使用push后会导致ESP一直在变,不好计算传入参数的地址而已。多写写就能记住。
练习:写个3数相加的函数。在敲代码之前,先画张图,理清下思路:
1.第一张图完成了计算,并将结果存入EAX寄存器中。说明下,图中的X地址只是用于做标示的,管它是多少来着。图上最后一张框里的汇编代码写错了,把ECX写成EBX了,害得后面写代码也写错了╮(﹀_﹀)╭,仔细调试才发现写错,截图截了好几次,好累。
2.第二张图完成了恢复工作,恢复堆栈平衡,ECX,EDX,EBP3个寄存器恢复之前缓存的值。
开始敲代码,代码就按照上面2张图写,ECX寄存器所存储的值为了方便观察改成了12345678:
第一张图只是记录初始值。
第2张图,执行完call指令,观察堆栈里的值和ESP寄存器
第3张图执行完函数中的push指令,缓存了3个寄存器的值,并将ESP寄存器的值赋给EBP寄存器
第4张图,执行完了加法,并得到结果6,函数主要的功能完成,
最后一张图,几个pop指令加上retn指令恢复了堆栈平衡,和寄存器之前存储的值。变化就是栈顶上面有使用过的地址,提醒自己局部变量需要初始化。