汇编:关于栈的知识

1.入栈和出栈指令

[2. SS与SP](#2. SS与SP)

[3. 入栈与出栈](#3. 入栈与出栈)

[3.1 执行push ax ↑↑](#3.1 执行push ax ↑↑)

[3.2 执行pop ax ↓↓](#3.2 执行pop ax ↓↓)

[3.3 栈顶超界的问题](#3.3 栈顶超界的问题)

[4. 寄存器赋值](#4. 寄存器赋值)


基于8086CPU编程时,可以将一段内存当作栈来使用。一个栈段最大可以设为64KB(0-FFFFH)。

1.入栈和出栈指令

  • push(入栈)
  • pop (出栈)

--- push ax:将寄存器ax中的数据送入栈中

--- pop ax:从栈顶 取出数据送入 ax

--- 入栈和出栈操作都是以【 (16位)】为单位进行

--- pop和push可以在寄存器和内存之间传送数据

2. SS与SP

8086CPU中,有两个寄存器

  • SS:段寄存器,存放栈顶段地址
  • SP:寄存器,存放栈顶偏移地址【专用寄存器】

任意时刻SS:SP指向栈顶元素。

若栈为空,sp指向最高地址单元的下一个单元。

3. 入栈与出栈

栈顶是低地址单元, 栈底是高地址单元。

3.1 执行push ax ↑↑
  • sp=sp-2(偏移地址减少,即往低地址处偏移[栈顶方向])
  • 将ax中的内容送入到ss:sp指向的内存单元
  • ss:sp此时指向新栈顶
3.2 执行pop ax ↓↓
  • 将ss:sp指向的内存单元的内容送入到ax中(取出的内容在内存中仍存在,并没有被重置,下一轮push会覆盖)
  • sp=sp+2(偏移地址增加,即往高地址处偏移[栈底方向])
3.3 栈顶超界的问题

8086CPU没有记录栈顶上下限的寄存器,不保证栈的操作不会越界。栈空时pop出栈或当栈满时push入栈都会发生栈顶超界问题,操作到栈以外的数据。

4. 寄存器赋值

关于cs、ip、ss、sp、ds的赋值:

  • 可以通过mov直接给sp赋值【立即数寻址】
  • 不能通过mov给cs、ip、ss、ds赋值
  • 给cs和ip赋值需要使用jum指令
  • 给ss和ds赋值需要使用mov ss/ds, 寄存器;【寄存器寻址】
相关推荐
遇印记3 小时前
大二java学习笔记:二维数组
java·笔记·学习
bnsarocket5 小时前
Verilog和FPGA的自学笔记6——计数器(D触发器同步+异步方案)
笔记·fpga开发·verilog·自学·硬件编程
LK_076 小时前
【Open3D】Ch.3:顶点法向量估计 | Python
开发语言·笔记·python
li星野6 小时前
打工人日报#20251011
笔记·程序人生·fpga开发·学习方法
摇滚侠6 小时前
Spring Boot 3零基础教程,yml配置文件,笔记13
spring boot·redis·笔记
QT 小鲜肉6 小时前
【个人成长笔记】在Ubuntu中的Linux系统安装 anaconda 及其相关终端命令行
linux·笔记·深度学习·学习·ubuntu·学习方法
QT 小鲜肉6 小时前
【个人成长笔记】在Ubuntu中的Linux系统安装实验室WIFI驱动安装(Driver for Linux RTL8188GU)
linux·笔记·学习·ubuntu·学习方法
急急黄豆6 小时前
MADDPG学习笔记
笔记·学习
Chloeis Syntax7 小时前
栈和队列笔记2025-10-12
java·数据结构·笔记·
QZ_orz_freedom8 小时前
学习笔记--文件上传
java·笔记·学习