PUSH指令 POP指令
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PUSH指令 POP指令相关的知识,希望对你有一定的参考价值。
一、push、pop指令的作用:push和pop
都是堆栈操作指令。实现压入操作的指令是push指令;实现弹出操作的指令是pop指令。
二、push的操作过程是:
(sp)<--(sp)-2,((sp))<--oprd
即先修改堆栈指针sp(压入时为自动减2),然后,将指定
的操作数送入新的栈顶位置.
此处的((sp))<--oprd,也可以理解为:
[(ss)*16+(sp)]<--oprd
或
[ss:sp]<--oprd
三、什么是堆栈
堆栈被定义为一种先进后出的数据结构,即最后进栈的元素将被最先弹出来.这很像许多人进入一条窄得只能
容纳一个人通过的小道,如果要从这条道往回退出来的话,那么最先退出来的人是最后一个进入小道的人。 参考技术A push()
方法可向数组的末尾添加一个或多个元素,并返回新的长度。
pop()
方法用于删除并返回数组的最后一个元素。
@array=(1,2,3,4);
$array.push(5); //1,2,3,4,5
$array.pop(); //5
汇编语言通用数据处理指令——堆栈传送指令
通用数据处理指令——堆栈传送指令
一、堆栈概述
(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
以上是关于PUSH指令 POP指令的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向x86 汇编 ( push / pop 入栈 / 出栈 指令 | ret / retn 函数调用返回指令 | set 设置目标值指令 )
Android 逆向x86 汇编 ( push / pop 入栈 / 出栈 指令 | ret / retn 函数调用返回指令 | set 设置目标值指令 )