一只程序猿的养成日记 第一章 第八节 栈帧结构补充

来源:互联网 发布:知乎新人 编辑:程序博客网 时间:2024/06/10 06:49

上次发的栈帧结构,莫名图片被挡掉了

重新写一次

如果有错误请各位大神指出,谢谢


第一步 初始化  建立mian函数的栈帧结构。




                                 

第二步 初始化 存储 变量“a”





        

第三步 初始化 存储 变量“b”




            

第四步 将变量“b”的值存储到 寄存器 “eax”  并将 寄存器压入 “main” 函数的栈帧中。



                      


第五步 将变量“a”的值存储到 寄存器 “ecx”  并将 寄存器压入 “main” 函数的栈帧中。




                         

第六步 call 命令:1,将当前命令的下一条指令的 地址 压入栈中,作为返回时的地址。

2,随即,跳转至指定函数。(jmp)







- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 


                    

第七步 将 “ebp”寄存器中的地址 压入栈中;






                    

第八步 将“ebp”栈底寄存器下移 与“esp”重合;







第九步 将“esp”栈顶寄存器下移44h,创建属于my-add的栈帧




                               

第十步 将“ebp”+8即“a”的值写入“eax”寄存器后,再与“ebp”+12即“b”完成相加。相加后的值存入“eax”寄存器压入my-add函数的栈底。






                          

第十一步 返回 将“ebp”-4即z的值存储在寄存器“eax”中。








第十二步 将“esp”寄存器与“ebp”重合,释放my-add函数的栈帧。







第十三步 “pop”指令将“main-ebp”放入“ebp”寄存器,“esp”栈顶寄存器随机上移,“ebp”寄存器回到“main”函数栈底。






第十四步 “ret”指令 跳出函数 将“main-ret”保存到“eip”寄存器。






第十五步 “esp”栈顶寄存器上移8回到最初的位置;将“eax”中存放的z的值即a+b赋值给c变量。






阅读全文
0 0
原创粉丝点击