内存存储方式
CPU中用16位寄存器来存储一个字(1 word = 2 bytes = 16 bits). 其中高8位存放高字节, 低8位存放低字节. 如下图, 用0 , 1两个内存单元存放数据20000(4E20H).
DS和[address]
- CPU读写一个内存单元时,必须要先给出这个内存单元的地址.
- 内存地址由段地址和偏移地址组成.
- 数据段寄存器DS( Data Segment ), 用来存放要访问数据的段地址.
mov BX, 1000H #向BX寄存器中写入1000H
mov DS, BX #将BX寄存器中的值移入DS寄存器
mov AL,[0] #将地址单元1000h:0中的值移入AX寄存器中的低位.
#"[]"说明操作对象是一个内存单元
- "[...]"表示一个内存单元, [0] 表示内存单元的偏移地址为0. 在执行指令时8086CPU自动读取DS寄存器中的数据作为内存单元的 段地址 .
- 因为8086CPU的硬件设计无法使用mov指令直接对DS寄存器写入数据.
- 段寄存器:
- 代码段寄存器CS(Code Segment).
- 数据段寄存器DS(Data Segment).
- 堆栈段寄存器SS(Stack Segment).
- 附加段寄存器ES(Extra Segment).
例题:
mov、add、sub指令
- mov
- mov 段寄存器, 寄存器.
- mov 寄存器, 段寄存器.
- mov 内存单元, 寄存器.
- mov 内存单元, 段寄存器.
- mov 段寄存器, 内存单元.
- add和sub
CPU提供的栈机制
- 栈(stack), 有两个基本操作: LIFO(Last In First Out)
- 入栈: 将新元素放入栈顶.
- 出栈: 从栈顶取出一个元素.
- 8086CPU提供入栈(PUSH)和出栈(POP)指令. 例如:
- push ax : 表示将寄存器ax中的数据送入栈中.
- pop ax : 表示从栈顶取出数据送入ax.
- 注意: 在8060CPU中push/pop操作都是以word(16 bits)为单位. 图例:
- CPU如何知道栈顶的地址?
- 8086CPU中有两个寄存器:
- 段寄存器SS.
- 寄存器SP.
*任意时刻,SS:SP 都指向栈顶元素.
push、pop指令
1. push/pop 寄存器
2. push/pop 段寄存器
3. push/pop 内存单元
- 将10000H~1000FH这段空间作为栈, 初始栈是空的, 将AX, BX, DS中的数据入栈.
分析:
1. 需要设置栈空间.则需要设置SS:SP.
2. push AX BX DS.
代码:
mov ax, 1000 ;将段地址写入寄存器ax.
mov ss, ax ;将ax寄存器中的值写入ss段寄存器.
mov sp, 0010 ;将偏移地址写入sp寄存器.
;将AX, BX, DS中的数据入栈
push ax
push bx
push ds
栈段
- 栈段就是将一组地址连续, 起始地址为16的倍数的内存单元当作栈空间来使用.
- 栈段的最大容量为64KB. 因为在执行push, pop指令时只修改SP, 而SP的变化换位是0-FFFFH, 所以为64KB.