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指令的主要内容,如果未能解决你的问题,请参考以下文章

汇编中push指令后面可以直接加数字吗 比如push

Android 逆向x86 汇编 ( push / pop 入栈 / 出栈 指令 | ret / retn 函数调用返回指令 | set 设置目标值指令 )

Android 逆向x86 汇编 ( push / pop 入栈 / 出栈 指令 | ret / retn 函数调用返回指令 | set 设置目标值指令 )

PUSH进栈指令和POP出栈指令

汇编中push指令后面可以直接加数字吗 比如push

64 位模式不支持 32 位 PUSH 和 POP 指令 [重复]