寄存器
8086CPU的所有寄存器都是16位的
通用寄存器
AX,BX,CX,DX
这四个寄存器通常用来存放一般性的数据,称为通用寄存器
这四个寄存器均可分成两个独立使用的8位寄存器
AX
可分为AH
和AL
BX
可分为BH
和BL
CX
可分为CH
和CL
DX
可分为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]
指向新栈顶。