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

来源:互联网 发布:淘宝食品店铺装修 编辑:程序博客网 时间:2024/06/08 17:39


第一步 初始化  建立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