前言:
从访问内存的角度来了解8086CPU的寄存器
内存中字的存储
CPU中使用16位寄存器来存储一个字。高8位存放在高字节,低8位存放在低8位
字单元:即存放一个字型数据(16位)的内存单元,由两个地址连续的内存单元组成。高地址内存中存放字型数据的高位字节,低地址内存单元中存放字型数据的地位字节
任何两个连续的内存单元,N号单元和N+1单元,可以将他们看成两个内存单元,也可以看成一个地址位N的字单元中的高位字节单元和低位字节单元
DS和[address]
8086CPU中,内存地址由以下组成:
1:段地址
2:偏移地址
8086CPU中,有一个DS寄存器地址,通常用来存放数据的段地址。
比如我们要读取10000H的单元内容,可以用如下的程序段进行。
mov bx,1000H
mov ds,bx
mov al,[0]
上面3条数据指令将10000H(1000:0)中的数据读到AL中
mov al,[0]
我们使用mov指令可以完成2种操作:
1:将数据直接送入寄存器
2:将一个寄存器中的数据送入到另外一个寄存器。
也可以使用mov指令将一个内存单元中的内容送入一个寄存器中。从哪个内存单元送到哪一个寄存器呢? 所以在指令中必须指明。寄存器用寄存器来指明,内存单元则用内存单元来指明。
[…] 表示一个内存单元。[…]中的0表示内存单元的便宜地址。我们知道,只有偏移地址是不能定位一个内存单元的。那么内存单元的段地址是多少呢? 执行指令时,8086CPU会自动取DS中的数据为内存单元的段地址。
如何用MOV指令从10000H中读取数据呢? 10000H用段地址和偏移地址表示为1000:0. 我们可以先讲1000H放入DS中。然后mov al,[0].就完成了传送。
mov 指令中[]表示操作的对象是一个内存单元。 [0]表示操作的是一个内存单元的偏移地址是0。它的段地址默认保存是放在ds中。执行指令时,CPU会自动从DS中取出。
如何把一个数据送入寄存器?
ds是一个段寄存器,8086CPU不支持将数据直接送入到短寄存器的操作。
那么如何将数据送入进去呢?
我可以在事前用一般的寄存器就好了。
mov bx,1000H
mov ds,bx
字的传送
因为8086CPU是16位结构,有16根数据线,所以,可以一次传输16位的数据,也就是可以一次性传送一个字
mov、add、sub指令
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
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
注:jmp是一个操作对象的指令,段寄存器中不能出现add,sub
栈
在数据结构中我们学习了栈的定义,知道栈是一个先进后出的特殊的存储空间(LIFO)
栈有两种基本操作:入栈(push),出栈(pop)
入栈:将一个新的元素放到栈顶
出栈:从栈顶取出一个元素
CPU提供的栈机制
8086CPU提供入栈和出栈指令,最基本的就是PUSH和POP
CPU如何知道栈顶的位置?
段寄存器SS和寄存器SP,栈顶的段地址放在SS中,偏移地址存放在SP中。任意时刻,SS:SP指向栈顶元素。
push ax的执行步骤:
- SP=SP-2,SS:SP指向当前栈顶前面的单元,以当前栈顶前面的单元为新栈顶
- 将ax中的内容送入SS:SP指向的内存单元出,SS:SP此时指向新的栈顶
任意时刻,SS:SP指向栈顶元素,当栈顶为空的时候,栈中没有元素,也就不存在栈顶元素,所以SS:SP只能指向栈的最底部单元,该单元的偏移地址为栈最底部的字单元的偏移地址+2,栈最底部字单元地址为1000:000E,所以栈空时,SP=0010H
pop ax的执行过程:
(1)将SS:SP指向的内存单元处的数据送入ax
(2)SP=SP+2,SS:SP指向当前栈顶下面的单元,以当前栈顶下面的单元为新的栈顶
push、pop指令
push和popo指令的格式:
push 寄存器 ;入栈,将一个寄存器中的数据入栈
pop 寄存器 ;出栈,用一个寄存器接收出栈的数据
push 段寄存器 ;入栈,将一个寄存器中的数据入栈
pop 段寄存器 ;出栈,用一个寄存器接收出栈的数据
push 内存单元 ;入栈,将一个寄存器中的数据入栈(栈操作都是以字为单位)
pop 内存单元 ;出栈,用一个寄存器接收出栈的数据
注:push和pop指令同mov指令不同,CPU执行mov指令只需要一步操作,就是传送,而执行push,pop指令却需要两部操作。
执行push时,CPU的两部操作是:先改变SP,然后向SS:SP处传送。
执行pop时,CPU的两部操作是:先读取SS:SP,然后改变SP