[汇编]汇编学习笔记(2):EBP寻址

徘徊边缘 提交于 2019-11-27 13:40:45

        刚看到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指令恢复了堆栈平衡,和寄存器之前存储的值。变化就是栈顶上面有使用过的地址,提醒自己局部变量需要初始化。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!