汇编语言_第3章 寄存器

第3章 寄存器(内存访问)

3.1 内存中字的存储

  • 字单元,即存放一个字型数据(16位)的内存单元,由2个地址连续的内存单元组成。高地址内存单元存放字型数据的高位字节,低地址内存单元中存放字型数据的地位字节。
  • 起始地址为N的字单元简称为N地址字单元。

3.2 DS 和 [address]

DS寄存器:用来存放要访问的数据的段地址。
在这里插入图片描述
注:

  • 8086CPU 不支持将数据直接送入段寄存器的操作,属于8086CPU 硬件设计的问题。
  • 将数据从寄存器送入内存单元 : mov [0],al

3.3 字的传送
在这里插入图片描述

3.4 mov、add、sub 指令
在这里插入图片描述
add 和 sub 指令同mov 一样,也可以有以下几种形式
在这里插入图片描述

3.5 数据段

可以将一组长度为N(N≤64KB)、地址连续、起始地址为16的倍数的内存单元当作专门存储数据的内存空间,从而定义了一个数据段。 例:123B0H~123B9H 数据段,段地址为123BH,长度为10个字节。

如何访问数据段中的数据?
用ds存放数据段的段地址,再根据需要,用相关指令访问数据段中的具体单元。
在这里插入图片描述
在这里插入图片描述

3.6 栈
在这里,我们对栈的研究仅限于这个角度:栈是一种具有特殊的访问方式的存储空间。特殊性:最后进入这个空间的数据,最先出去。

栈的两个基本操作:
入栈:将一个新的元素放到栈顶
出栈:从栈顶取出一个元素
操作规则:LIFO(Last In First Out) 后进先出

在这里插入图片描述
在这里插入图片描述

3.7 CPU 提供的栈机制

8086 CPU 提供入栈、出栈指令, 最基本的2个:

  • PUSH(入栈): push ax 将寄存器ax中的数据送入栈中
  • POP (出栈): pop ax 表示从栈顶取出数据送入ax
    注:8086CPU 的入栈和出栈操作都是以为单位进行的。
  • 段寄存器SS: 存放栈顶的段地址;
  • 寄存器SP: 存放偏移地址;
    任意时刻SS:SP 指向栈顶元素
    在这里插入图片描述

当栈为空时 ,SP 指向 栈最底部单元下面的单元,该单元的偏移地址为栈最底部的字单元的偏移地址+2。
在这里插入图片描述

3.8 栈顶超界的问题
8086 CPU 没有控制栈顶、栈底的寄存器,使用时 要根据可能用到的最大栈空间,来安排栈大小,防止超界。

3.9 push、pop 指令
push 、pop指令的格式:

  • push 寄存器 ;将一个寄存器中的数据入栈
  • pop 寄存器 ;出栈,用一个寄存器接收出栈的数据
  • push 段寄存器 ;将一个段寄存器中的数据入栈
  • pop 段寄存器 ;出栈,用一个段寄存器接收出栈的数据
  • push 内存单元 ;将一个内存字单元处的字入栈
  • pop 内存单元 ;出栈,用一个内存单元接收出栈的数据

注意:栈操作都是以字为单位
在这里插入图片描述

- push 指令执行步骤: ①SP=SP-2; ② 向SS:SP 指向的字单元中送入数据
- pop 指令执行步骤:①从SS:SP 指向的字单元中读取数据;② SP=SP+2;

8086CPU 提供的栈操作机制:SS、SP 指示栈顶; 改变SP后写内存的入栈指令;读内存后改变SP的出栈指令。

3.10 栈段
可以将长度为N(N≤64KB)的一组地址连续、起始地址为16的倍数的内存单元,当作栈空间来用,从而定义了一个栈段。

- 段的综述
可以将一段内存定义为一个段,用一个段地址指示段,用偏移地址访问段内的单元。

  • 可以用一个段存放数据,将它定义为“数据段”;

  • 可以用一个段存放代码,将它定义为“代码段”;

  • 可以用一个段当作栈,将它定义为“栈段”;

若要访问这些段:

  • 数据段:将它的段地址放在DS中,用mov、sub、add 等访问内存单元的指令时,CPU就将我们定义的数据段中的内容当做数据来访问;
  • 代码段:将它的段地址放在CS中,将段中第一条指令的偏移地址放在IP中,这样CPU就将执行我们定义的代码段中的指令;
  • 栈段:将它的段地址放在SS中,将栈顶单元的偏移地址放在SP中,这样CPU 在需要进行栈操作的时候,如push、pop,就将我们定义的栈段当作栈空间来用。

一段内存,可以既是代码的存储空间,又是数据的存储空间,还可以是栈空间,也可以什么都不是。关键在于CPU中寄存器的设置,即CS、IP,SS、IP,DS 的指向。

预备知识:Debug的使用 知识补充1
(1) D命令:“d 段寄存器:偏移地址”,以段寄存器中的数据为段地址SA,列出从SA:偏移地址开始的内存区间中的数据。
在这里插入图片描述
(2)在E、A、U 这些可以带有单元地址的命令中,也可同D命令一样,用段寄存器表示内存单元段地址。
在这里插入图片描述
(3)Debug的T命令在执行修改SS的指令时,下一条指令也紧接着被执行。

To be continue…

猜你喜欢

转载自blog.csdn.net/madao1234/article/details/83338260