DS寄存器
通常用来存储要访问的地址所在的段地址
如欲将CS:IP = 1000:0即10000H的位置的数据读入al中,如下:
; 将1000这个数值送入bx
mov bx, 1000H
; 将bx的内容送入ds
; 不能直接将数据送入ds,硬件设计如此
mov ds, bx
; [0]给出内存单元的偏移地址,执行mov指令时cpu自动取ds的内容作为段地址。
mov al, [0]
将ax中的16位内容送入10000H单元的代码如下:
; 1000H送到bx
mov bx, 1000H
; 送到ds
mov ds, bx
; 将ax中的内容mov到段地址为1000H,内存偏移为0的位置
mov [0], ax
栈
8086CPU提供入栈和出栈指令,最基本的两个是push和pop,入、出栈时均以字节为操作单位。
CPU中有两个寄存器SS:SP
来指示栈顶地址,供出入栈时使用,
入栈指令push ax
可将ax的内容入栈,其实际可分为以下两步:
- SP = SP - 2,执行后,SS:SP指示的栈顶从高地址向低地址方向增长了2B。
- 将ax的内容送入
SS:SP
所指的内存单元
出栈指令pop ax
用于将栈顶的16位内容出栈送入ax中,其执行过程与入栈指令相反,不再赘述。
栈空的表示:若将10000H~1000FH这段空间当作栈,则栈底的字单元地址为1000EH,即若当前栈中只有一个元素,则SS:SP = 1000H:000EH
,将此元素出栈后,SP = SP + 2
,有SS:SP = 1000H:0010H
栈顶越界:若栈满时执行入栈,栈空时执行出栈,则分别会使栈顶超过栈空间上界和下界,8086CPU并未提供保护机制。
栈顶的表示范围:因为栈操作指令如push、pop只能改变sp的内容,因此其可变化的范围是0~FFFFH。