--堆栈操作:运行时栈在系统层上(由硬件直接实现)处理子过程调用。是由CPU直接管理的内存数组,使用两个寄存器:SS和ESP。堆栈指针寄存器ESP指向最后压入到堆栈上的数据。运行时栈在内存中总是向下增长的(由高地址到低地址)
压栈PUSH堆栈指针减4.出栈POP堆栈指针加4.
堆栈指针ESP之下的区域从逻辑上讲是空白的。
过程内的局部变量在堆栈上创建,过程结束时,这些变量被丢弃。
调用过程时,通过压栈传递输入值(参数)
CALL时,CPU用堆栈保存当前被调用过程的返回地址。
--PUSH r/m16
PUSH r/m32
PUSH imm32
--POP r/m16
POP r/m32
--PUSHFD指令在堆栈上压入32位的EFLAGS寄存器的值
POPFD指令弹出堆栈顶部的值并送至EFLAGS寄存器
类似的PUSHF和POPF用在实地址模式下,FLAGS寄存器。
.data
saveFlags DWORD ?
.code
pushfd ;标志入栈
pop saveFlags ;复制到变量
......
push saveFlags ;将保存的标志入栈
popfd
--PUSHAD指令在堆栈上按EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI顺序压入所有的32位通用寄存器。
POPAD以相反顺序从堆栈中弹出。
类似的实地址模式下的指令:PUSHA和POPA
保护和恢复寄存器的值。
--在32位模式下,CPU总是执行EIP(指令指针寄存器)所指向的内存地址处的指令;在16位模式下,CPU总是执行IP寄存器所指向的内存地址处的指令。
CALL指令把返回地址(紧跟CALL指令的地址,CALL指令的机器码需要5个字节,00000020+5)压入堆栈并把被调用过程的地址复制到指令指针寄存器中。
RET指令从堆栈中弹出返回地址并送到指令指针寄存器。