内存中字的存储
- 在CPU中用16位寄存器存储一个字,高八位存高字节,低八位存低字节。在内存中,由于内存单元是字节单元,一个字要使用两个地址连续的内存单元来存放。
- 讲起始地址为N的字单元简称为N地址字单元。
> 比如:2地址字单元,则这个字单元的起始地址为2,由2、3两个内存单元组成。
DS和[address]
DS存储器:通常用来存放要访问数据的段地址。
mov bx,1000H 将1000H送入bx寄存器
mov ds,bx 将bx里的内容送入ds中
mov al,ds:[0] 将内存地址ds:[0]中的内容送进al中
- mov 指令将一个内存单元的内容送入一个寄存器中,
但在指令中中必须指从哪个内存单元送到哪个寄存器,
此时指令格式应该是:mov 寄存器名,内存单元地址
从内存单元到寄存器的格式是:
mov 内存单元地址,寄存器名
[...]
表示一个内存单元,其内容表示内存单元的偏移地址,指令执行时,CPU自动取ds中的数据作为内存单元的段地址。
疑问:
为什么8086CPU不支持将数据直接送入段寄存器(ds)的操作?
回答:
这属于其硬件设计的问题!!!
CPU的栈机制
- 8086CPU的入栈出栈操作都是以字为单位进行的。
- 栈顶处于低位,栈底处于高位。
基本操作:
push ax 将寄存器ax的内容入栈
pop ax 从栈顶取出数据送入ax
注意:当进行POP操作后,所出栈的元素依然存在于原来的内存中,但是它已不在栈中。当再次执行push等入栈操作后将写入新的数据,将其覆盖。
段寄存器SS与寄存器SP
- 段寄存器SS:存放栈顶的段地址。
- 寄存器SP:存放栈顶的偏移地址。
任意时刻,SS:SP指向栈顶元素
执行push指令时,CPU先改变Sp,后向SS:SP处传入数据。
执行pop指令时,CPU先读取SS:SP处的数据,后改变SP。
提问:
当发生栈溢出时(栈满入栈,栈空出栈),CPU如何知道?
回答:
它不知道!8086CPU不保证我们的操作不会超界,它只考虑当前栈顶在何处、要执行的命令是哪一条。而栈溢出的问题,需要我们编程的时候自己考虑。