汇编语言 2.9 2.10 2.11 2.12 段寄存器,CS IP,代码段

2.9 段寄存器

8086CPU在访问内存时,要由相关部件提供内存单元的段地址和偏移地址,送入加法器合成物理地址。

8086CPU中有四个段寄存器:

CS, DS, SS, ES

2.10 CS 和 IP

CS和IP是8086CPU中两个最关键的寄存器。

CS为代码段寄存器, IP为指令指针寄存器(偏移地址寄存器)。

8086机中,任意时刻,CPU将CS:IP指向的内容当做指令执行。

过程如下:

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

在8086CPU启动或者复位后,CS和IP被设置为CS=FFFFH,IP=0000H,即刚开机时,CPU从内存FFFF0H单元中读取指令执行,FFFF0H单元中的指令是8086PC机开机后执行的第一条指令。

因为在任何时候,CPU将CS,IP中的内容当做指令的段地址和偏移地址,用他们合成指令的物理地址,到内存中读取指令码,执行。如果说,内存中的一段信息曾被CPU执行过,那么,他所在的内存单元必定会被CS:IP指向过。

2.11 修改CS、IP的指令

在CPU中程序员只能用指令读写的部件只有寄存器, 可以通过改变寄存器中的内容实现对CPU的控制。CPU从何处执行指令是由CS、IP中的内容决定的,程序员可以通过改变CS、IP中的内容来控制CPU执行目标指令。

  1. mov指令,被称为传送指令
  2. jmp指令,能够改变CS、IP的内容的指令被统称为转移指令,jmp是最简单的。

例如,

jmp 2AE3:3, 执行后: CS=2AE3H, IP=0003H,CPU将从2AE33H处读取指令

jmp 段地址:偏移地址(合法寄存器): 用寄存器中的值修改IP

jmp 还要另外一个用法:

例如

jmp ax 含义为类似于: mov IP, ax

2.12 代码段

| mov ax, 0000 | (B80 00 00) |
| add ax, 0123H | (05 23 01) |
| mov bx, ax | (8B D8) |
| jmp bx | (FF E3) |

这里共有10个字节(复习:两个16进制位可以表示一个字节(=8bit))

CPU只认识被CS:IP指向的内存单元中的内容为指令。所以,要让CPU执行我们放在代码段中的指令,必须要将CS:IP指向所定义的代码段中的第一条指令的首地址(代码示例的第一行)。