第6章子程序设计 6.1堆栈 6.2子程序 6.3 WindOws api
第6章 子程序设计 6.1 堆栈 6.2 子程序 6.3 Windows API
6.1堆栈 ■供程序使用的一块连续的内存空间; 用于保存和读取一些临时的数据 ■堆栈中的数据有以下几个特点: 临时性 ■快速性 动态扩展性
6.1 堆栈 ◼ 供程序使用的一块连续的内存空间; ◼ 用于保存和读取一些临时的数据 ◼ 堆栈中的数据有以下几个特点: ◼ 临时性 ◼ 快速性 ◼ 动态扩展性
6.1.1堆栈空间 相关的3个寄存器:SS,ESP和EBP 在 Windows用户模式下 SS段寄存器通常和DS,ES段寄存器相等 ESP寄存器中的内容作为堆栈的当前指针 EBP寄存器中的内容作为堆栈的“基准”指 针
6.1.1 堆栈空间 ◼ 相关的3个寄存器:SS,ESP和EBP ◼ 在Windows用户模式下 ◼ SS段寄存器通常和DS,ES段寄存器相等 ◼ ESP寄存器中的内容作为堆栈的当前指针。 ◼ EBP寄存器中的内容作为堆栈的“基准”指 针
6.1.2进栈和出栈指令 1.进栈指令PUSH 格式: PUSH SRC 功能:堆栈指针ESP减4,SRC保存在ESP指 向的堆栈单元中。 SRC可以是32位寄存器、内存操作数、立即 数或16位段寄存器
6.1.2 进栈和出栈指令 1.进栈指令PUSH 格式:PUSH SRC 功能:堆栈指针ESP减4,SRC保存在ESP指 向的堆栈单元中。 ◼ SRC可以是32位寄存器、内存操作数、立即 数或16位段寄存器
2.出栈指令POP 格式: POP DST 功能:从ESP指向的堆栈单元中取出数据送 到DST中,堆栈指针ESP加4。 ■DST是32位寄存器、内存操作数或16位段寄 存器 立即数不能作为DST
2.出栈指令POP 格式:POP DST 功能:从ESP指向的堆栈单元中取出数据送 到DST中,堆栈指针ESP加4。 ◼ DST是32位寄存器、内存操作数或16位段寄 存器。 ◼ 立即数不能作为DST
PUSH、POP指令要点 注意进栈和出栈的顺序 入栈: 出栈(与入栈相反) PUSH EAⅩ POP EDX PUSH EBX POP ECX PUSH ECX POP EBX PUSH EDX POP EAX
3.PUSH、POP指令要点 注意进栈和出栈的顺序 入栈: PUSH EAX PUSH EBX PUSH ECX PUSH EDX 出栈 (与入栈相反) POP EDX POP ECX POP EBX POP EAX
4. PUSHFD指令 格式: PUSHFD 功能:堆栈指针ESP减4, EFLAGS标志寄存 器保存在ESP指向的堆栈单元中。 举例:将 EFLAGS标志寄存器复制到EAX中 PUSHFD POP EAX
4.PUSHFD指令 格式:PUSHFD 功能:堆栈指针ESP减4,EFLAGS标志寄存 器保存在ESP指向的堆栈单元中。 举例:将EFLAGS标志寄存器复制到EAX中 PUSHFD POP EAX
5. POPFD指令 格式: POPFD 功能:从ESP指向的堆栈单元中取出数据送 到 EFLAGS中,堆栈指针ESP加4。 举例: PUSHFD和 POPFD可以配对使用,用来保存 和恢复程序某一时刻的标志。 PUSHFD ;保存状态寄存器 ;执行其他的指令 POPFD ;恢复状态寄存器
5.POPFD指令 格式:POPFD 功能:从ESP指向的堆栈单元中取出数据送 到EFLAGS中,堆栈指针ESP加4。 举例:PUSHFD和POPFD可以配对使用,用来保存 和恢复程序某一时刻的标志。 PUSHFD ; 保存状态寄存器 … ; 执行其他的指令 POPFD ; 恢复状态寄存器
6. ENTER指令 格式: ENTER SRC1,SRC2 功能:SRC1和SRC2是两个立即数。 SRC2=0时,该指令相当于下面的3条指令 PUSH EBP Mov EBP ESP SUB ESP SRC1
6.ENTER指令 格式:ENTER SRC1, SRC2 功能:SRC1和SRC2是两个立即数。 SRC2=0时,该指令相当于下面的3条指令 PUSH EBP MOV EBP, ESP SUB ESP, SRC1
7.LEAV指令 格式: LEAVE 功能:令ESP等于EB,再从堆栈弹出EBP 相当于: MOV ESP. EBP POP EBP 常用于子程序返回之前
7.LEAVE指令 格式:LEAVE 功能:令ESP等于EBP,再从堆栈弹出EBP。 相当于: MOV ESP, EBP POP EBP 常用于子程序返回之前