在上篇文章中,我们主要从CPU的角度复习了8086CPU的逻辑结构,形成物理地址的方法和相关的一些寄存器。这篇文章我们一内存访问的角度来继续学习几个寄存器。
内存中字的存储:
CPU中,用16位寄存器来存储一个字。高8位存放高位字节,低8位存放低位字节。在内存中存储时,由于内存单元是字节单元(一个单元存放一个字节,8位),则一个字节要用两个地址连续的内存单元来存放,这个字的低位字节存放在低地址单元中,高位字节存放在高地址单元中。高地址单元和低地址单元组成了字单元。
DS和[address]:
CPU在读写一个内存单元时,必须给出这个内存单元的地址,在8086CPU中,内存地址单元有段地址和偏移地址组成。DS寄存器通常用来存放要访问数据的段地址。比如我们要访问10000H单元的内容,可以用如下的程序段进行:
mov bx,10000H
mov ds,bx
mov al,[0]
注意,DS寄存器不支持直接将数据放入其中,需要用一个寄存器作为中间变量。
mov al,[0] = mov al,ds:[0] 即将10000H:0处内存单元的内容存入al中。
mov ,add ,sub指令:
mov指令有以下几种形式:
mov 寄存器 , 数据 例如:mov ax , 8
mov 寄存器 , 寄存器 例如:mov ax , bx
mov 寄存器 , 内存单元 例如:mov ax , [0]
mov 内存单元 , 寄存器 例如:mov [0] . ax
mov 段寄存器 , 寄存器 例如:mov ds , ax
add和sub指令同mov一样,都有两个操作数,它们可以有以下几种形式:
add 寄存器 , 数据 例如:add ax , 8
add 寄存器 , 寄存器 例如:add ax , bx
add 寄存器 , 内存单元 例如:add ax , [0]
add 内存单元 , 寄存器 例如:add [0] , ax
sub 寄存器 , 数据 例如:sub ax , 9
sub 寄存器 , 寄存器 例如:sub ax , bx
sub 寄存器 , 内存单元 例如:sub ax,[0]
sub 内存单元 , 寄存器 例如:sub [0] , ax
CPU提供的栈机制:
8086CPU提供入栈和出栈指令,最基本的两个是PUSH(入栈)和POP(出栈)。
CPU如何知道栈顶的位置?显然,也应该有相应的寄存器来存放栈顶的地址。8086CPU中,有两个寄存器,段寄存器SS和寄存器SP,栈顶段地址存放在SS中,偏移地址存放在SP中。任意时刻,SS:SP指向栈顶元素。
push和pop指令有以下几种格式:
push 寄存器 ;将一个寄存器的数据入栈
pop 寄存器 ;出栈,用一个寄存器接收出栈的数据
push 段寄存器 ;将一个段寄存器中的数据入栈
pop 段寄存器 ;出栈,用一个段寄存器接收出栈的数据
push 内存单元 ;将一个内存单元中的数据入栈
pop 内存单元 ;出栈,用一个内存字单元接收出栈数据