安防之家讯:堆栈是一个重要的数据结构,它具有 “ 先进后出 ” 的特点,通常用来保存程序的返回地址。它主要有两大类操作:进栈操作和出栈操作。
1 .进栈指令 PUSH
2 .出栈指令 POP
1 进栈指令 PUSH
PUSH(PushWordorDoublewordontoStack)
语句格式: 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(PushAllGeneralRegisters)
指令格式: PUSHA ;80286+
其功能是依次把寄存器 AX 、 CX 、 DX 、 BX 、 SP 、 BP 、 SI 和 DI 等压栈。
PUSHAD(PushAll32-bitGeneralRegisters)
指令格式: PUSHAD ;80386+
其功能是把寄存器 EAX 、 ECX 、 EDX 、 EBX 、 ESP 、 EBP 、 ESI 和 EDI 等压栈。
2 出栈指令 POP
POP(PopWordorDoublewordoffStack)
语句格式: 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(PopAllGeneralRegisters)
指令格式: POPA ;80286+
其功能是依次把寄存器 DI 、 SI 、 BP 、 SP 、 BX 、 DX 、 CX 和 AX 等弹出栈。其实,程序员不用记住它们的具体顺序,只要与指令 PUSHA 对称使用就可以了。
POPAD(PopAll32-bitGeneralRegisters)
指令格式: POPAD ;80386+
其功能是依次把寄存器 EDI 、 ESI 、 EBP 、 ESP 、 EBX 、 EDX 、 ECX 和 EAX 等弹出栈,它与 PUSHAD 对称使用即可。安防之家专注于各种家居的安防,监控,防盗,安防监控,安防器材,安防设备的新闻资讯和O2O电商导购服务,敬请登陆安防之家:http://anfang.jc68.com/