寄存器(内存访问)

内存中字的存储

CPU中16位寄存器存储一个字型数据,在内存中存储时,内存单元是字节单元,则一个字型数据要用两个地址连续的内存单元来存放,这个字的地位字节存放在地位地址汇总,高位字节存放在高位地址中。
字单元的概念:存放一个字型数据(16位)的内存单元,由连个地址连续的内存单元组成。
将起始地址为N的字单元检测为N地址子单元

DS和[address]

DS寄存器用来存放数据地址的段地址
可以将内存单元中的数据存放到寄存器中去
mov al,[0]
将寄存器中的数据存储到内存单元中
mov [00ff],ax

DS寄存器不同于[ABCD]X寄存器,不可以使用 mov ds,1000H的方式对其进行赋值

字的传送

可以将一组起始地址为16的倍数、地址连续、长度为N(N<=64KB)的内存单元当做专门的数据存储空间

栈:具有特殊访问方式的连续内存空间

CPU提供的栈机制

8086CPU提供入栈和出栈的指令,最基本的是 PUSH(入栈)和 POP(出栈)。比如,push ax 表示将寄存器 ax 中的数据送入栈中,pop ax 表示从栈顶去除数据送入 ax。8086CPU的入栈和出栈操作都是以字为单位操作的。
push 和 pop 指令的格式可以是如下形式:
push 寄存器 将一个寄存器的数据入栈
pop 寄存器 用一个寄存器接受出栈的数据
push 内存单元 将一个内存单元处的字入栈
pop 内存单元 用一个内存单元接收出栈的数据
push [0]
pop [2]

关于栈的操作有两点疑问:

  1. 如何设置图中空间,才能使图中空间作为栈使用push和pop进行操作的
  2. push和pop时是如何知道哪个内存单元是栈顶的
    8086CPU中有两个寄存器,段寄存器 SS 和寄存器 SP,这两个寄存器所组成的地址就是栈顶内存单元地址
    push ax 的执行,由以下两步完成
  3. SP=SP-2,SS:SP所组合的内存地址作为栈顶内存单元地址
  4. 将ax中的内容送入 SS:SP指向的内存单元处

pop ax 的执行过程和push ax 刚好相反,由以下两步完成

  1. 将SS:SP指向的内存单元处的数据送入ax中
  2. SP=SP+2,SS:SP所组合的内存地址作为栈顶内存单元地址

debug的 t 命令在执行修改寄存器 SS 的指令时,下一条指令也会紧接着被执行

栈顶越界问题

依靠 SS 和 SP 可以确保在入栈和出栈时找到栈顶,但是如何保证在入栈、出栈时,栈顶不会超出占空间?

8086CPU不保证我们对栈的操作不会越界,8086CPU只知道栈顶在哪里,不知道栈空间大小

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

分析:栈最底部的字单元地址为 1000:FFFE,现在栈状态为空,栈中没有元素,也就不存在栈顶元素,所以 SS:SP 只能指向栈的最底部单元下面的单元,该单元的地址为为栈最底部字单元地址+2,FFFE+2=10000,SP 中保存0000H,所以当栈为空的时候,SS=1000H,SP=0

posted @ 2020-10-14 14:51  nineTong  阅读(324)  评论(0)    收藏  举报