堆栈是一个重要的数据结构,它具有 “ 先进后出 ” 的特点,通常用来保存程序的返回地址。它主要有两大类操作:进栈操作和出栈操作。
1 .进栈指令 PUSH 2 .出栈指令 POP 1 进栈指令 PUSH PUSH(Push Word or Doubleword onto Stack) 语句格式: PUSH OPS 功能:将寄存器、段寄存器或存储器中的一个字数据压入堆栈,堆栈指针减 2 。 即 : ① (SP)- 1→ SP (OPS)15~8 → [SP] ② (SP)- 1→ SP (OPS)7~0 → [SP] PUSH Imm ;80286+ 一个字进栈,系统自动完成两步操作: SP←SP-2 , (SP)← 操作数; 一个双字进栈,系统自动完成两步操作: ESP←ESP-4 , (ESP)← 操作数。 PUSHA(Push All General Registers) 指令格式: PUSHA ;80286+ 其功能是依次把寄存器 AX 、 CX 、 DX 、 BX 、 SP 、 BP 、 SI 和 DI 等压栈。 PUSHAD(Push All 32-bit General Registers) 指令格式: PUSHAD ;80386+ 其功能是把寄存器 EAX 、 ECX 、 EDX 、 EBX 、 ESP 、 EBP 、 ESI 和 EDI 等压栈。 2 出栈指令 POP POP(Pop Word or Doubleword off Stack) 语句格式: POP OPD 功能: 将栈顶元素弹出送至某一寄存器、段寄存器(除 CS 外)或存储器,堆栈指针加 2 。 从 POP 指令功能可看出,该指令为 PUSH 指令的逆过程。 即: ①( [SP] )→( OPD ) 7~0 ( SP ) + 1→ SP ②( [SP] )→( OPD ) 15~8 ( SP ) + 1→ SP 弹出一个字,系统自动完成两步操作:操作数 ←(SP) , SP←SP-2 ; 弹出一个双字,系统自动完成两步操作:操作数 ←(ESP) , ESP←ESP-4 。 POPA(Pop All General Registers) 指令格式: POPA ;80286+ 其功能是依次把寄存器 DI 、 SI 、 BP 、 SP 、 BX 、 DX 、 CX 和 AX 等弹出栈。其实,程序员不用记住它们的具体顺序,只要与指令 PUSHA 对称使用就可以了。 POPAD(Pop All 32-bit General Registers) 指令格式: POPAD ;80386+ 其功能是依次把寄存器 EDI 、 ESI 、 EBP 、 ESP 、 EBX 、 EDX 、 ECX 和 EAX 等弹出栈,它与 PUSHAD 对称使用即可。 |
电工学习网 ( )
GMT+8, 2021-12-6 20:45