【汇编语言】通用数据处理指令——堆栈传送指令

通用数据处理指令——堆栈传送指令

在这里插入图片描述

一、堆栈概述

(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

在这里插入图片描述

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BkbK-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值