您现在的位置是:首页 > 创新技术
32位微处理器指令系统之堆栈操作指令
智慧创新站
2024-11-16【创新技术】38人已围观
简介堆栈的概念堆栈是在内存RAM中开辟的一段空间,利用“先进后出”或“后进先出”原则存取数据。如果把数据压入堆栈,则堆栈指针的值是减少的,即所谓的向下生成堆栈。由SS:SP(16位)或SS:ESP(32位)指向栈底(栈空)或栈顶(栈不空)地址。利用数据入栈指令PUSH和数据出栈指令POP操作堆栈。1.数...
堆栈的概念
堆栈是在内存RAM中开辟的一段空间,利用“先进后出”或“后进先出”原则存取数据。
如果把数据压入堆栈,则堆栈指针的值是减少的,即所谓的向下生成堆栈。
由SS:SP(16位)或SS:ESP(32位)指向栈底(栈空)或栈顶(栈不空)地址。
利用数据入栈指令PUSH和数据出栈指令POP操作堆栈。
1.数据入栈指令指令格式:PUSHOPS
功能:将OPS中的数据压入堆栈中。若压入堆栈中的OPS是16位,则SP(16位CPU)或ESP(32位CPU)减2;若OPS是32位,ESP(32位CPU)减4。
PUSH一般有如下三种:
PUSHreg16/32;寄存器reg必须是16或32位PUSHsegPUSHmem16/32;内存中的数据必须是16或32位PUSHimm16/32;将16位或32位立即数压入堆栈2.数据出栈指令
指令格式:POPOPD
功能:将栈顶元素弹出送到某一寄存器、段寄存器(CS除外)或内存中。注意OPS一定是16或32位。弹出栈的数据若是16位,SP或ESP加2;若数据是32位,ESP加4。
POP一般有如下三种:
POPreg16/32;寄存器reg必须是16或32位POPseg;seg不能为CS、SSPOPmem16/32;存储器长度必须是16或32位
弹出肯定是从栈顶开始:LIFO原先的ax在下面,要等到原先的Bx弹出再弹出ax。
AX,BX入栈后原来的数据还在;只不过经过出栈后原来的数据被修改了,结果是交换了数据。
栈实际上是个中转站。
数据的交换必须要通过第三方中转。
MOVCX,AXMOVDX,BXMOVAX,DXMOVBX,CX
这段指令实际上是利用CX,DX做中转站交换AX,BX;道理是一样的;
只不过栈的操作原则是LIFO。
PUSH/POP相关的其他指令(1)存储器操作数入栈与出栈
PUSHWmem;16位存储器操作数入栈PUSHDmem;32位存储器操作数入栈
或
PUSHWORDPTRmem(16)PUSHDWORDPTRmem(32)POPWORDPTRmem(16)POPDWORDPTRmem(32)
(2)多个16位通用寄存器入栈和出栈
16位数据入栈/出栈配对使用指令:PUSHA/POPA。
PUSHA:
将AX、BX、CX、DX、SP、BP、SI、DI这8个16位通用寄存器的值依次压入堆栈(指针减),其中SP的值是在此条指令未执行之前的值,该指令执行后,SP-16(字节)→SP。
POPA:
依次弹出堆栈中的16位字节到DI、SI、BP、SP、DX、CX、BX、AX中,该指令执行后,SP+16→SP。
(3)多个32位通用寄存器入栈与出栈
PUSHAD
将EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI这8个32位通用寄存器的值依次压入堆栈,其中ESP的值是在此条指令未执行之前的值,指令执行后,ESP-32→ESP。
POPAD
依次弹出堆栈中的32位字到EDI、ESI、EBP、ESP、EBX、EDX、ECX、EAX中,弹出完成后,ESP+32→ESP。
上述两组指令用于过程设计时,PUSHA和PUSHAD在过程开始时暂存通用寄存器的当前值,POPA和POPAD在过程结束时恢复通用寄存器的值,必须配对使用。
(4)16位标志寄存器F的入栈和出栈。
PUSHF;将16位标志寄存器F的值入栈POPF;将栈顶弹出2个字节送给16位标志寄存器F,;或弹出送到32位标志寄存器的低16位中。
操作码POPF的含义是:popflagsoffstack。
(5)32位标志寄存器入栈和出栈
PUSHFD;是将32位标志寄存器EFLAGS的值;入栈POPFD;从堆栈栈顶处连续弹出4字节送;给32位的标志寄存器EFLAGS
当从堆栈中弹出4字节送给32位标志寄存器时,只有在当前特权级为0时,才能从堆栈中弹出4字节标志送给EFLAGS,使得EFLAGS中的I/O特权级标志位IOPL才能被替换。
(6)ENTER和LEAVE指令
ENTER/LEAVE指令把EBP寄存器内容入栈/出栈,并在堆栈中为局部变量分配/释放存储空间,通常在子程序调用时使用该组指令。
很赞哦!(135)