第5章 过程

来源:互联网 发布:古惑仔结局知乎 编辑:程序博客网 时间:2024/06/06 13:02

5.1 堆栈操作

5.1.2 PUSH 和 POP 指令

PUSH 指令
PUSH 指令首先减少 ESP 的值,再将游、操作数复制到堆拢 。 操作数是 16 位的,则 ESP减 2 ,操作数是 32 位的,则 ESP 减 4 。 PUSH 指令有 3 种格式:

PUSH reg/meml6PUSH reg/mem32PUSH imm32

POP 指令
pop 指令首先把 ESP 指向的堆梳元素内容复制到 一个 16 位或 32 位目的操作数中,再增加 ESP 的值。 如果操作数是 16 位的, ESP 加 2 ,如果操作数是 32 位的, ESP 加 4:

POP reg/meml6POP reg/mem32

PUSHFD 和 POPFD 指令
PUSHFD 指令把 32 位 EFLAGS 寄存器内容压人堆钱,而 POPFD 指令则把栈顶单元内容弹出到 EFLAGS 寄存器:

pushfdpopfd

PUSHAD, PUSHA, POPAD 和 POPA
PUSHAD 指令按照 EAX 、 ECX 、 EDX 、 EBX 、 ESP (执行 PUSHAD 之前的值)、 EBPESI 和 EDI 的顺序,将所有 32 位通用寄存器压人堆栈 。 POPAD 指令按照相反顺序将同样的寄存器弹出堆栈。与 之相似. PUSHA 指令按序( AX 、 ex 、 DX 、 BX 、 SP 、 BP 、 SI 和 DI)将 16 位通用寄存器压人堆栈 。 POPA 指令按照相反顺序将同样的寄存器弹出堆栈 。 在 16 位模式下,只能使用 PUSHA 和 POPA 指令 。

5.2 定义并使用过程

5.2.2 CALL 和 RET 指令

CALL 指令调用一个过程,指挥处理器从新的内存地址开始执行 。 过程使用 RET (从过程返回)指令将处理器转回到该过程被调用的程序点上 。 从物理上来说, CALL 指令将其返回地址压人堆栈,再把被调用过程的地址复制到指令指针寄存器。当过程准备返回时,它的
RET 指令从堆找把返回地址弹回到指令指针寄存器 。 32 位模式下, CPU 执行的指令由 EIP(指令指针寄存器)在内存中指出 。

5.2.6 保存和恢复寄存器

USES 运算符
USES 运算符与 PROC 伪指令一起使用,让程序员 列出在该过程中修改的所有寄存器名 。 USES 告诉汇编器做两件事情:第一,在过程开始时生成 PUSH 指令,将寄存器保存到堆栈;第二,在过程结束时生成 POP 指令,从堆栈恢复寄存器的值。 USES 运算符紧跟在PROC 之后,其后是位于同一行上的寄存器列表,表项之间用空格符或制表符(不是逗号)分隔 。

原创粉丝点击