8086汇编学习笔记03

物理地址

系列文章

8086CPU是16位结构的CPU(或称16位机、字长为16位等)。因此它具有以下特性:

8086CPU的寻址步骤为:

  1. CPU的相关部件提供两个16位的地址,一个称为段地址,一个称为偏移地址
  2. 段地址和偏移地址通过内部总线被送入一个称为地址加法器的部件
  3. 地址加法器将两个16位的地址合成一个20位的物理地址
  4. 地址加法器再通过内部总线将20位物理地址送入输入输出控制电路
  5. 输入输出控制电路将20位物理地址送上地址总线
  6. 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

CSIP 是8086CPU中两个最关键的寄存器。CS代码段寄存器IP 指令指针寄存器

CS 寄存器负责提供段地址,IP 寄存器负责提供偏移地址。任意时刻,8086CPU将 CS : IP 指向的内容当作指令执行

因此,8086CPU的工作过程为:

  1. CS : IP 指向的内存单元读取指令,读取的指令进入指令缓冲器
  2. IP +=所读取指令的长度,从而指向下一条指令
  3. 执行指令缓冲器中的指令,然后转到步骤1,重复以上过程

在8086CPU加电启动或复位后(即CPU刚开始工作时),CSIP 被设置为 CS =FFFFHIP =0000H,因此CPU从内存FFFF0H单元中读取指令执行,FFFF0H单元中的指令是8086CPU开机后执行的第一条指令

指令和数据的本质都是二进制数,它们的区别在于:CPU会将 CS : IP 指向的内存单元中的数据看作指令

修改CS与IP: JMP指令

MOVADD 指令不可用于修改 CSIP 寄存器的内容,因为8086CPU不支持这样的功能。要修改 CSIP 中的内容,可以使用 JMP 指令:

JMP指令(转移指令)
格式1:
JMP segment_addr : offset_addr
用途1:
用指令中给出的段地址 segment_addr 修改 CS 寄存器,偏移地址 offset_addr 修改 IP 寄存器。
格式2:
JMP legal_register
用途2:
用某一合法寄存器 legal_register 中的值修改 IP 寄存器

JMP AX”,语义上类似于“MOV IP, AX”,但是后者不被允许。