3.1内存中字的存储
内存单元是字节单元(即一个单元存一个字节)
一个字用两个地址连续的单元存放,低位字节存在低地址,高位字节存在高地址
字单元:存放一个字型数据(16位)的内存单元,由两个地址连续内存单元组成
将起始地址为N的字单元简称为N地址字单元
3.2DS和[address]
ds:通常用来存放要访问的数据的段地址
[...]表示一个内存单元,"..."是偏移地址,cpu自动取ds中的数据作为内存单元的段地址
如何用mov指令从10000H中读取数据:先将段地址1000H放入ds,然后用mov al,[0]
但8086不支持将数据直接送入段寄存器,所以:
mov bx,1000H
mov ds,bx
3.3字的传送
8086有16根数据线,在mov指令中给出16位的寄存器就能进行字的传送
3.4mov、add、sub指令
mov指令可有以下形式:
mov 寄存器,数据 如:mov ax,8
mov 寄存器,寄存器 如:mov ax,bx
mov 寄存器,内存单元 如:mov ax,[0]
mov 内存单元,寄存器 如:mov [0],ax
mov 段寄存器,寄存器 如:mov ds,ax
mov 寄存器,段寄存器 如:mov ax,ds
mov 内存单元,段寄存器 如:mov [0],ds
mov 段寄存器,内存单元 如:mov ds,[0]
add、sub同mov
3.5数据段
将一段内存当作数据段,是我们在编程时的一种安排,即用ds存放数据段的段地址
3.6栈
栈:后进先出(LIFO:last in first out)
3.7cpu提供的栈机制
push ax将AX中的数据入栈
pop ax从栈顶取出数据送入AX
8086的入栈和出栈以字为单位
SS:栈顶的段地址,SP:栈顶的偏移地址 (SS是段寄存器,不能直接送入数据,但SP可以)
任意时刻,SS:SP指向栈顶元素
push ax:
sp = sp - 2,SS:SP指向当前栈顶前面的单元
将ax中的内容送入SS:SP指向的内存单元
(入栈时,栈顶从高地址向低地址方向增长)
pop ax:
将SS:SP指向的内存单元处数据送入ax
SP=SP+2
3.8栈顶超界的问题
8086不保证我们对栈的操作不会超界,他只知道栈顶在何处,而不知道我们安排的栈空间有多大
我们要自己考虑栈超界的问题
3.9push、pop指令
push 寄存器
pop 寄存器
push 段寄存器
pop 段寄存器
push 内存单元
pop 内存单元
可只给出内存单元的偏移地址,段地址从ds获得
3.10栈段
也是我们在编程时的一种安排
如果将10000H~1FFFFH当作栈段,栈空时,SP=?
当只有一个元素时,SS=1000H,SP=FFFEH,此元素出栈,SP=SP+2,所以SP=0
栈最底部字单元的地址为1000:FFFE,栈空时,SS:SP指向最底部单元下面的单元,即最底部+2,即SP=0000H
一个栈段最大可以设为多少?
从栈空时SP=0,一直压栈,直到栈满时SP=0,再次压栈,栈顶将环绕,覆盖原来内容,所以最大0~FFFFH,64KB