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

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

2. 栈顶的元素总是最后入栈,最先出栈;后进先出。

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寄存器中的数据。

[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

13. 编程

如果要在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

栈Stack和段寄存器SS,SP(学习汇编),布布扣,bubuko.com

时间: 2024-12-27 01:28:26

栈Stack和段寄存器SS,SP(学习汇编)的相关文章

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

段寄存器是因为对内存的分段管理而设置的. 16位CPU有四个段寄存器,其程序可同时访问四个不同含义的段,引用方面有如下规定:1. 取命令:段寄存器CS指向存放程序的内存段,IP是用来存放下条待执行的指令在该段的偏移量,把它们合在一起可在该内存段内取到下次要执行的指令.2. 取堆栈:段寄存器SS指向用于堆栈的内存段,SP是用来指向该堆栈的栈顶,把它们合在一起可访问栈顶单元.另外,当偏移量用到了指针寄存器BP,则其缺省的段寄存器也是SS,并且用BP可访问整个堆栈,不仅仅是只访问栈顶.3. 取数据:段

微处理器寄存器(段寄存器)

段寄存器为16位寄存器,用于与微处理器中的其它寄存器联合生成存储器地址. 对于同一微处理器而言,段寄存器的功能在实模式下和保护模式下是不同的. 代码寄存器CS(Code Segment) CS用于保存微处理器使用的代码,CS定义代码段的起始地址. 实模式下,CS定义一个64K字节存储器段的起点:保护模式下它选择一个描述代码段起始地址.长度及其他一些必要的属性信息(可读.可写.可被执行等). 数据段寄存器DS(Data Segment) DS是包含程序所使用的大部分数据的存储区.DS用于定义数据段

汇编语言——寄存器(内存访问 ds数据段寄存器,ss栈段寄存器)

在内存中字的存储 这段话的主要意思是:一个字=2B=16bit,CPU中是用两个内存单元储存一个字(假如获取0地址存放的字型数据,就是获取它的高位字节0+1位和低位字节0位的数据,数据由高地址位向低地址位读) 问题: (1)0地址单元中存放的字节型数据是多少? #  20H(2)0地址字单元中存放的字型数据是多少? # 4e20H(3)2地址字单元中存放的字节型数据是多少? # 12H(4)2地址单元中存放的字型数据是多少?    #  0012H(5)1地址字单元中存放的字型数据是多少? #

bss段、data段、text段、堆(heap) 和 栈(stack)

bss段: bss段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域. bss是英文Block Started by Symbol的简称. bss段属于静态内存分配. data段: 数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域. 数据段属于静态内存分配. text段: 代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域. 这部分区域的大小在程序运行前就已经确定,并且内存

BSS段 data段 text段 堆heap 和 栈stack

BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简称.BSS段属于静态内存分配.   数据段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域.数据段属于静态内存分配.   代码段:代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域.这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只

(深入理解计算机系统) bss段,data段、text段、堆(heap)和栈(stack)

bss段: bss段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域. bss是英文Block Started by Symbol的简称. bss段属于静态内存分配. data段: 数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域. 数据段属于静态内存分配. text段: 代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域. 这部分区域的大小在程序运行前就已经确定,并且内存

包含多个段(学习汇编)

将数据.代码.栈放入不同的段:把这些内容全部放在代码段中无疑会让程序显得混乱而且难以管理和操作,容易出错,所以,要把数据.代码和栈放入不同的段中,这也体现了软件工程中“分而治之”的思想. assume cs:code, ds:data, ss:stackdata segment dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h //dw的意思是“define word”,即定义了已连串的字型数据(后面8个数据)data ends

汇编——段寄存器

段寄存器 8086CPU有14个寄存器 AX,BX,CX,DX,si,di,sp,bp,ip,cs,ss,ds,es,psw 其中有8个通用寄存器 8086寄存器16位,可以存放两个字节 AX BX CX DX一般用来存放一般数据 为保证兼容性,这四个寄存器可以分为两个独立的8位寄存器使用 AX可以分为AH和AL H高L低 同样的对于ABCD-X 字在寄存器中的存储 一个字可以存在一个16位寄存器中 Word=2B 关于数制的讨论 二进制太冗长 几条汇编指令 Mov ax,18         

汇编-8086内部寄存器+对段寄存器使用的约定

<微型计算机原理与接口技术(第2版)>冯博琴 吴宁 主编-清华大学出版社——做笔记用 一.8088/8086的14个16位寄存器: //------------------------------------------------------------------------------------------------------------------------------- 1.通用寄存器——8个 (1)数据寄存器——4个 AX: 累加器,常用于存放算数逻辑运算中的操作数,另外所