菜鸟学汇编005 栈(Stack) 和 段寄存器SS、SP

分类: 菜鸟学汇编2010-10-22 20:22 523人阅读 评论(3) 收藏 举报

1. 栈有2个基本操作:入栈、出栈

入栈就是将一个新的元素放到栈顶;出栈就是从栈顶取出一个元素;

2. 栈顶的元素总是最后入栈,最先出栈;栈的这种操作规则被称为:LIFO(Last In First Out) 后进先出。

3. 8086CPU提供入栈和出栈的指令,最基本的两个是 PUSH(入栈) 和 POP(出栈)

push ax 表示将AX寄存器的内容送入栈中, pop ax 表示从栈顶取出数据送入AX寄存器中。

    8086CPU的入栈和出栈操作都是以字(word)为单位的。

4. 8086CPU中,段寄存器SS:存放栈顶段地址,段寄存器SP: 存放栈顶的偏移地址。

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

6. 8086CPU不保证我们对栈的操作是否会越界。

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

8.  push 指令的执行步骤:

(1) SP = SP - 2         (偏移地址减少,即往低地址处偏移[栈顶方向])

(2) 向SS:SP指向的字单元中送入数据

9. pop 指令的执行步骤:

(1) 从SS:SP指向的字单元中读取数据

(2) SP = SP + 2       (偏移地址增加,即往高地址处偏移[栈低方向])

10. 8086CPU只记录栈顶,栈空间的大小要我们自己管理。

11. 例子:

如果将10000H ~ 1000FH 这段空间作为栈,初始状态栈是空的,此时SS=1000H,SP = ?

解答:

这个可以图解。

首先,低地址单元在栈顶方向,高地址单元在栈低方向 。如下图所示。

低地址

10000H

1000DH

1000EH

1000FH

-------------------

10010H                          <-------------SS:SP指向栈空间最高地址单元的下一个单元。

假设 AX = 2266H, 因为8086CPU的入栈和出栈操作都是以字为单位的 。所以,结果看下图示。

10000H

1000DH

1000EH    66H   (AL)      <-------------SS:SP

1000FH    22H   (AH)

--------------------------------------------

10010H

以10000H ~ 1000FH这段空间为栈空间,SS=1000H,栈空间大小为16个字节。

当初始状态栈为空时,SP = 0010H。

12.  编程:

(1) 将10000H~1000FH这段空间作为栈,初始状态栈是空的。

(2) 设置AX寄存器 = 001AH, BX寄存器 = 001BH。

(3) 将AX、BX寄存器中的数据入栈。

(4) 将AX、BX寄存器清零。

(5) 从栈中恢复AX、BX寄存器原来的内容。

[cpp] view plaincopy
  1. mov ax, 1000H
  2. mov ss, ax
  3. mov sp, 0010H
  4. mov ax, 001AH
  5. mov bx, 001BH
  6. push ax
  7. push bx
  8. mov ax, 0     ; 也可用 sub ax, ax
  9. mov bx, 0     ; 也可用 sub bx, bx
  10. ; sub ax, ax的机器码为2个字节
  11. ; mov ax, 0的机器码为3个字节
  12. pop bx
  13. pop ax

13. 编程

(1) 将10000H~1000FH这段空间当作栈,初始状态栈是空的。

(2) 设置AX寄存器 = 001AH, BX寄存器 = 001BH。

(3) 利用栈,交换AX、BX寄存器中的数据。

[cpp] view plaincopy
  1. mov ax, 1000H
  2. mov ss, ax
  3. mov sp, 0010H
  4. mov ax, 001AH
  5. mov bx, 001BH
  6. push ax
  7. push bx
  8. pop ax
  9. pop bx

14. 编程

如果要在10000H入写入字型数据2266H,可以使用以下代码完成:

[cpp] view plaincopy
  1. mov ax, 1000H
  2. mov ds, ax
  3. mov ax, 2266H
  4. mov [0], ax

要求:不能使用“ mov 内存单元, 寄存器"这类指令,完成上面的功能。

[cpp] view plaincopy
  1. mov ax, 1000H
  2. mov ss, ax
  3. mov sp, 2
  4. mov ax, 2266H
  5. push ax

分享到: 
  • 上一篇:菜鸟学汇编004 DS寄存器
  • 下一篇:菜鸟学汇编006 第一个汇编程序
查看评论
1楼 plysan 2010-12-18 20:19发表 [回复]
楼主,如果我没理解错的话,14. 编程 中的第一段代码的第二行应该是 mov ss, ax 吧。。。

Re: ilysony 2010-12-18 22:01发表 [回复]
回复 plysan:两种写法。

菜鸟学汇编005 栈(Stack) 和 段寄存器SS、SP相关推荐

  1. 栈Stack和段寄存器SS,SP(学习汇编)

    1. 栈有2个基本操作:入栈.出栈 2. 栈顶的元素总是最后入栈,最先出栈:后进先出. 3. 8086CPU提供入栈和出栈的指令,最基本的两个是 PUSH(入栈) 和 POP(出栈) push ax ...

  2. 看动画学算法之:栈stack

    文章目录 简介 栈的构成 栈的实现 使用数组来实现栈 使用动态数组来实现栈 使用链表来实现 简介 栈应该是一种非常简单并且非常有用的数据结构了.栈的特点就是先进后出FILO或者后进先出LIFO. 实际 ...

  3. bss段,data段、text段、堆heap和栈stack

    bss段,data段.text段.堆heap和栈stack bss段 data段 text段 堆(heap) 栈(stack) 例子 在C的学习中,你总避免不了对各类数据的存储区域学习归纳总结,简单的 ...

  4. 汇编学习笔记1 通用寄存器和段寄存器详解

    一.通用寄存器 寄存器         编号(二进制) 编号(十进制)   64位 32位 16位 8位     累加寄存器 RAX EAX AX AL 000 0 计数寄存器 RCX ECX CX ...

  5. 汇编的8种寻址方式,以及2个默认段寄存器

    16位CPU所含有的寄存器有(见图2.1中16位寄存器部分): 4个数据寄存器(AX.BX.CX和DX) 2个变址和指针寄存器(SI和DI) 2个指针寄存器(SP和BP) ,32位CPU增加2个16位 ...

  6. 8086汇编学习之DS寄存器、SS/SP寄存器

    相关博客:8086汇编基础知识.通用寄存器.CS/IP寄存器与Debug的使用 一.DS寄存器 一个8086CPU寄存器均是16位的,而数据类型有以下两种: 1Byte = 8bit (字节型数据) ...

  7. 通用寄存器介绍和段寄存器的介绍

    以下内容来自百度百科: (提示:点击蓝色的字,可以进入百度百科看相关内容) 通用寄存器 目录 简介 主要用途 相关信息 编辑本段简介 通用寄存器 通用寄存器可用于传送和暂存数据,也可参与算术逻辑运算, ...

  8. IA-32寄存器(通用寄存器、EFLAGS寄存器、指令指针寄存器、段寄存器)

    文章目录 一.通用寄存器(GPR) 二.EFLAGS寄存器(标志寄存器) 三.指令指针寄存器(EIP) 四.段寄存器(Segment Register) 通用寄存器(General Purpose R ...

  9. 段寄存器和8种地址寻址方式

    段寄存器是因为对内存的分段管理而设置的. 16位CPU有四个段寄存器,其程序可同时访问四个不同含义的段,引用方面有如下规定: 1. 取命令:段寄存器CS指向存放程序的内存段,IP是用来存放下条待执行的 ...

最新文章

  1. Asynctask源码分析
  2. matlab函数 size()函数和waterfal()l函数,三维图形,矩阵
  3. 吴恩达邀请9位AI大牛畅想2020:李开复看好医疗教育,LeCun强调自监督学习
  4. CSS属性选择器和部分伪类
  5. C语言 二进制文件读取和写入
  6. js计算器代码加减乘除_如何用jQuery做一个简易版计算器
  7. linux git指令不存在,一些常用的Git命令
  8. excel2003 java_java 读取 excel 2003 或 excel 2007
  9. c++代码打印爱心图(适用初学者)
  10. wx僵尸粉检测,真实好友1.0(无障碍检测好友状态)
  11. 图像加密算法毕业论文【含代码】
  12. java三三剩二五五剩三,大年三十彩灯悬,彩灯齐明光灿灿,三三数时能数尽,五五数时剩一盏,七七数时刚刚好,八八数时还缺三,...
  13. session是什么
  14. HTML正方体滚动特效
  15. 计算机网络谢希仁(1)
  16. 搭建一个点歌QQ机器人,另外还能看美女
  17. 2012中国世界十大科技进展(转载)
  18. cmgr linux命令,linux下利用GPRS模块发短信、打电话
  19. 异星工厂 自动机器人_异星工厂建设机器人怎么用 异星工厂建设机器人机制介绍-游侠网...
  20. 如何准确测试相位噪声

热门文章

  1. Android 从底层实现让应用杀不死(1)
  2. GitBook制作电子书
  3. 如何有效控制项目范围?
  4. gear s3刷android wear,【干货】三星Gear S3/Gear S3 classic 智能手表刷机教程
  5. C语言调用函数一次就自动结束了 不执行下面的程序 帮忙看看把
  6. EasyPoi实现excel文件导入导出
  7. 80×60长40米的地笼_住宅走廊宽1米2,长10米,不想打波线,用80公分的砖怎么铺平均60,还是80十40,上有...
  8. tplink 703N拆机接ttl
  9. banner设圆角_C4D和PS如何制作banner
  10. 【网站搭建】腾讯云域名服务器购买域名解析及宝塔安装