寄存器
8086CPU的所有寄存器都是16位的
通用寄存器
AX,BX,CX,DX
这四个寄存器通常用来存放一般性的数据,称为通用寄存器
这四个寄存器均可分成两个独立使用的8位寄存器
AX可分为AH和ALBX可分为BH和BLCX可分为CH和CLDX可分为DH和DL
物理地址
8086CPU给出物理地址的方式为:
物理地址 = 段地址 ∗ 16 + 偏移地址 物理地址=段地址*16 + 偏移地址物理地址=段地址∗16+偏移地址
记作:[段地址:偏移地址]
段寄存器
CS,DS,SS,ES
可用一个段存放数据,定义为“数据段”,将其段地址存放于DS中,用mov,add,sub等访问内存的指令时,这样CPU将定义的数据段中的内容当作数据访问。
可用一个段存放代码,定义为“代码段”,将其段地址存放于CS中,将段中第一条指令的偏移地址存放于IP中,这样CPU将执行定义的代码段中的指令。
可用一个段当作栈,定义为“栈段”,将其段地址存放于SS中,将栈顶元素的偏移地址存在SP中,这样CPU在需要进行栈操作时,将定义的栈段当作栈空间来使用。
CS
CS和 IP是8086CPU中两个最关键的寄存器,他们指示了CPU当前要读取指令的地址。
CS: 代码段寄存器
IP: 指令指针寄存器
8086机中,任意时刻,CPU将 CS: IP指向的内容当作指令执行
mov指令不能用来设置CS和 IP的值
修改CS``````IP的值的命令为:jmp
可用jmp <段地址>:<偏移地址>形式的命令同时修改CS和 IP的值,修改后CS=<段地址>,IP=<偏移地址>
也可用jmp <某一合法寄存器>的形式来单独修改IP中的值,修改后IP=
<某一合法寄存器>中的值。
jmp命令详见文章:占位
[address]
可用[···]表示一个内存单元
[···]中的数字表示内存单元的偏移地址,段地址会取用ds中的数据作为内存单元的段地址
DS
DS:用来存放要访问的数据的段地址
下例为将[1000:0]中的数据读到ax中
mov bx,1000H
mov ds,bx
mov ax,[0]
8086CPU不支持将数据直接送入段寄存器的操作,需用一个通用寄存器进行中转
SS
SS为段寄存器,存放栈顶的段地址
SP存放偏移地址
在任意时刻,SS:SP指向栈顶元素
8086CPU提供push入栈操作和pop出栈操作,每次操作都是以字为单位进行的,也就是SP的移动量为+或者-2。
pop ax表示从栈顶[SS:SP]取出数据送入ax,后SP+2, 此时[SS:SP]指向新栈顶。
push ax先将SP-2,表示将ax中的数据送入[SS:SP],此时[SS:SP]指向新栈顶。