字单元,字形数据16位
DS通常用来存要访问数据的段地址,不能直接从数据传入DS,必须要经过寄存器
mov bx,1000H
mov ds,bx ; 这步是必须的
mov al,[0] ; 数据从内存单元1000:0到al的传送
mov [0],al ; 数据从al到1000:0的传送
[0]说明这个内存单元的偏移地址是0,它的段地址默认放在ds里。执行时自动去ds里取出
8086不支持直接将数据送入段寄存器,mov ds 1000H是非法的。
mov al,[0] ;传的是一整个字,也就是16位(根据cpu的位数来算)
mov ds(段寄存器),ax √
mov ax,ds(段寄存器) √
mov 0,ax √
mov 0,cs(段寄存器) √
mov ds,as √
1.
AX=2662
AX=2662,BX=E626
AX=E662,BX=E626
AX=2662,BX=E626
AX=2662,BX=D6E6
AX=FD48,BX=D6E6
AX=2C14,BX=D6E6
AX=0000,BX=D6E6
AX=00E6,BX=D6E6
AX=00E6,BX=0000
AX=00E6,BX=0026
AX=000C
2.
cs=0x2000,ip=0x0,ds=0x1000,ax=0x0,bx=0x0
cs=0x2000,ip=0x3,ds=0x1000,ax=0x6622,bx=0x0
cs=0xff0,ip=0x100,ds=0x1000,ax=0x6622,bx=0x0
cs=0xff0,ip=0x103,ds=0x1000,ax=0x2000,bx=0x0
cs=0xff0,ip=0x105,ds=0x2000,ax=0x2000,bx=0x0
cs=0xff0,ip=0x108,ds=0x2000,ax=0xc389,bx=0x0
cs=0xff0,ip=0x10b,ds=0x2000,ax=0xea66,bx=0x0
LIFO last in first out。
注意,push ax进栈之后,ax的高位压入栈底(高地址),ax低位压入上面的一个内存单元。
SS:SP指向栈顶元素,SS是栈的段寄存器,SP永远存栈顶内存单元的偏移地址。
所以,入栈时候,栈顶从高地址向低地址方向增长。出栈的时候,栈顶从低地址向高地址方向增长。