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

Posted BkbK-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇编语言通用数据处理指令——堆栈传送指令相关的知识,希望对你有一定的参考价值。

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

在这里插入图片描述

一、堆栈概述

(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

在这里插入图片描述

以上是关于汇编语言通用数据处理指令——堆栈传送指令的主要内容,如果未能解决你的问题,请参考以下文章

求汇编指令集

x86汇编指令集大全

汇编指令大全

汇编指令集

汇编语言注释

汇编语言入门-总结