8086CPU是16位结构的CPU(或称16位机、字长为16位等)。因此它具有以下特性:
- 运算器一次最多可以处理16位的数据
- 寄存器的最大宽度为16位
- 寄存器与运算器之间的通路为16位
8086CPU的寻址步骤为:
- CPU的相关部件提供两个16位的地址,一个称为段地址,一个称为偏移地址
- 段地址和偏移地址通过内部总线被送入一个称为地址加法器的部件
- 地址加法器将两个16位的地址合成一个20位的物理地址
- 地址加法器再通过内部总线将20位物理地址送入输入输出控制电路
- 输入输出控制电路将20位物理地址送上地址总线
- 20位物理地址被地址总线传送到存储器
因此,8086CPU有20位地址总线,可以传输20位地址,寻址能力为1MB。
地址加法器采用 物理地址=段地址×16+偏移地址 的方式用段地址和偏移地址合成物理地址。
该地址合成思想是利用两个16位地址得到一个20位的地址,以弥补16位CPU寻址能力的不足。“段地址×16”的一个更常用的说法是左移4位,或在16进制下左移1位。例如,段地址2100H(16位)和偏移地址0F60H(16位),可以先将段地址在16进制下左移1位,得到21000H(20位),再与偏移地址相加得到21F60H(20位)。
“段地址×16” 也称为基础地址,所以可以认为8086CPU的寻址方式为:物理地址=基础地址+偏移地址。
注意,CPU可以用不同的段地址和偏移地址合成同一个物理地址。
“段地址”中“段”的说法并不是指内存被分段,而是指:每个段地址可以管理一段连续的内存。可以根据需要,将地址连续、起始地址为16的倍数的一组内存单元定义为一个段。
寄存器CS和IP
CS 和 IP 是8086CPU中两个最关键的寄存器。CS 为代码段寄存器,IP 指令指针寄存器。
CS 寄存器负责提供段地址,IP 寄存器负责提供偏移地址。任意时刻,8086CPU将 CS : IP 指向的内容当作指令执行。
因此,8086CPU的工作过程为:
- 从 CS : IP 指向的内存单元读取指令,读取的指令进入指令缓冲器
- IP +=所读取指令的长度,从而指向下一条指令
- 执行指令缓冲器中的指令,然后转到步骤1,重复以上过程
在8086CPU加电启动或复位后(即CPU刚开始工作时),CS 和 IP 被设置为 CS =FFFFH,IP =0000H,因此CPU从内存FFFF0H单元中读取指令执行,FFFF0H单元中的指令是8086CPU开机后执行的第一条指令。
指令和数据的本质都是二进制数,它们的区别在于:CPU会将 CS : IP 指向的内存单元中的数据看作指令。
修改CS与IP: JMP指令
MOV 和 ADD 指令不可用于修改 CS 和 IP 寄存器的内容,因为8086CPU不支持这样的功能。要修改 CS 和 IP 中的内容,可以使用 JMP 指令:
JMP
segment_addr
:
offset_addr
segment_addr
修改
CS
寄存器,偏移地址
offset_addr
修改
IP
寄存器。
JMP
legal_register
legal_register
中的值修改
IP
寄存器“JMP AX
”,语义上类似于“MOV IP, AX
”,但是后者不被允许。