- 一个典型的CPU使用运算器、控制器、寄存器等组成的。
- 8086CPU有14个寄存器,AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW,其中有8个是通用寄存器。
- 8086CPU所有寄存器都是16位的,可以存放两个字节。
- AX、BX、CX、DX通常用来存放一般性数据被成为通用寄存器。
- 8086CPU为了兼容上一代的8位CPU,AX、BX、CX、DX这四个可以分为两个独立的8位寄存器。比如AH(高位)和AL(低位)。
- 1字=2字节=16位(1Word=2Byte=16bit)。
- CPU访问内存时要给出内存单元的地址。所有的内存单元构成的存储空间是一个一维的线性空间,每一个内存单元在一个空间中都有唯一的地址,我们称为物理地址。
- 8086是16为结构的CPU,就是说,在8086内部,能过一次性处理、传输、暂时存储的信息的最大长度是16位。
- 8086CPU有20位的数据总线,有1MB寻址能力(2的20次方),8086CPU是16位结构,只能送出16位的地址,也就是64K的寻址能力,那怎么内部和外部怎么协同工作呢?
- 8086CPU采用一种在内部用两个16位地址合成的方法形成一个20位的物理地址。
- 地址加法器采用物理地址=段地址x16+偏移地址的方法用段地址和偏移地址合成物理地址。比如段地址1230H,偏移地址00C8,经过地址加法器时,将1230HX16(如同1230X10)变成的12300H(向左偏移了一位,相对二进制,向左偏移了4位),然后12300H+00C8=1230C8。
- “物理地址=段地址x16+偏移地址”的本质含义:CPU访问内存时,用一个基础地址(段地址X16)和一个相对于基础地址的偏移地址相加,给出内存单元的物理地址。
- 段寄存器就是提供段地址的。8086CPU有4个段寄存器:CS(代码),DS(数据),SS(堆栈),ES(不够的时候放这里)。
- CS和IP是8086CPU中两个最关键的寄存器,它们只是了CPU当前要读取指令的物理地址。CS为代码段寄存器,IP为指令指针寄存器(偏移地址)。
- 在8086CPU中,任意时刻,设CS中的内容为M,IP中的内容为N,8086CPU将从内存MX16+N单元开始读取一条指令并执行。也可以这样表达:8086机中,任意时刻,CPU将CS:IP指向的内容当作指令来执行。
- 8086CPU加电启动或复位后CS和IP被设置为CS=FFFFH,IP=0000H,即8086CPU刚开始工作时,CPU从内存FFFF0H单元中读取指令并执行。
- CPU将CS:IP指向的内存单元中的内容看作指令,如果说,内存中的一段形象曾被CPU执行过,那么他一定被CS:IP指向过。
- 程序员可以通过改变寄存器中的内容实现对CPU的控制。
- 8086CPU大部分寄存器的值,都可以用mov指令来改变,mov指令被称作传送指令。
- mov指令不能用于设置CS、IP的值,我们可以用最简单的jmp指令,若想同时修改CS、IP的内容,可用“jmp 段地址:偏移地址”指令完成,如jmp 2AE3:3,执行后:CS=2AE3H,IP=0003H,CPU将从2AE33H读取指令。
- “jmp 段地址:偏移地址”指令功能为:用指令中给出的段地址修改CS,偏移地址修改IP。
- 若只想修改IP内容,可用“jmp 某一合法寄存器”的指令完成,
如:jmp ax,指令执行前:ax=1000H,CS=2000H,IP=0003H,指令执行后:ax=1000H,CS=2000H,IP=1000H,jmp ax
-
CS存放指令的段地址,IP存放指令的偏移地址