通用数据处理指令——堆栈传送指令
一、堆栈概述
(1)堆栈定义
堆栈一个特殊的存储区域
存取原则:先进后出FILO(First In Last Out)
也可称为:后进先出LIFO ( Last In First Out)
- 具有两种基本的数据传输操作
- 数据压进堆栈 PUSH
- 数据弹出堆栈 POP
(2)IA-32处理器的堆栈段
IA-32处理器在主存空间构建堆栈段
- 堆栈段寄存器SS指向堆栈段的起始位置
- 堆栈指针寄存器ESP指定当前栈顶
- 数据传输通过堆栈的当前栈顶
- 堆栈段栈底标示了堆栈区域
IA-32处理器的堆栈向下生长
- 数据压入堆栈、ESP逐渐减小
- 数据弹出堆栈、ESP逐渐增大
(3)堆栈的作用
-
堆栈不可或缺,被很多指令使用
►堆栈操作指令
►子程序调用CALL和返回RET
►中断调用INT和返回IRET等 -
内部异常、外部中断等也利用堆栈
-
堆栈可用来临时存放数据,以便随时恢复它们
-
利用堆栈实现主、子程序间传递参数
►利用堆栈基址指针EBP,随机读写堆栈数据mov ebp,esp ;EBP←ESP mov eax,[ebp+8] ;EAX←SS:[EBP+8] mov [ebp],eax ;SS:[EBP]←EAX
-
堆栈常用于子程序的寄存器保护和恢复
-
堆栈还用于支持(高级语言的)临时变量等
二、PUSH和POP指令
(1)进栈指令PUSH
►先将ESP减小作为当前栈顶
►后将源操作数传送到当前栈顶
PUSH r16/m16/i16/seg
① ESP=ESP-2
② SS:[ESP]=r16/m16/i16/seg
PUSH r32/m32/i32
① ESP=ESP-4
② SS:[ESP]=r32/m32/i32
- 以字或双字为单位操作
►进栈字量数据前,ESP减2
►进栈双字量数据前,ESP减4
例如:push eax
等同于如下2条指令
① sub esp,4 ② mov [esp],eax
(2)出栈指令POP
►先将栈顶数据传送到目的操作数
►后ESP增加作为当前栈顶
POP r16/m16/seg
① r16/m16/seg=SS:[ESP]
② ESP=ESP+2
POP r32/m32
① r32/m32=SS:[ESP]
② ESP=ESP+4
- 以字或双字为单位操作
►出栈字量数据后,ESP加2
►出栈双字量数据后,ESP加4
例如:pop eax
等同于如下2条指令
① mov eax,[esp]② add esp,4