2.9 段寄存器
段地址存储在段寄存器
8086CPU有4个段寄存器
CS、DS、SS、ES
当8086CPU要访问内存时,由这4个段寄存器提供内存单元的段地址
2.10 CS和IP
CS和IP是8086CPU中最关键的寄存器,他们指示当前要读取指令的地址。
CS:代码段寄存器
IP:指令指针寄存器
- 从CS:IP指向内存单元读取指令,读取的指令进入指令缓存器;
- IP = IP + 所读取指令的长度,从而指向下一条指令;
- 执行指令。转到步骤1,重复这个过程。
8086PC工作过程的简要描述
- 在8086CPU加电或复位后(CPU刚开始工作时)CP和IP被设置为CS=FFFFH,IP=0000H。
- 即在8086PC机刚启动时,CPU从内存FFFF0H单元中读取指令执行。
- FFFF0H单元中的指令是8086PC机开机后执行的第一条指令。
- 在任何时候,CPU将CS、IP中的内容当作指令的段地址和偏移地址,用它们合成指令的物理地址,到内存中读取指令码,再执行。
- 如果说,内存中的一段信息曾被CPU执行过,那么它所在的内存单元必然被CS:IP指向过。
2.11 修改CS、IP的指令
- 在CPU中,程序员能够用指令读写的部件只有寄存器,程序员可以通过改变寄存器中的内容实现对CPU的控制。
- CPU从何处执行指令是由CS、IP中的内容决定的,程序员可以通过改变CS、IP中的内容来控制CPU执行目标指令。
如何修改AX中的值?
mov指令可以改变8086CPU大部分寄存器的值:传送指令
- mov指令不能用于设置CS、IP的值,8086CPU没有提供这样的功能
jmp段地址:偏移地址
同时修改CS、IP的内容
功能:用指令中给出的段地址修改CS,偏移地址修改IP。
jmp 2AE3:3 >> 2AE33H
jmp 3:0B16 >> 0B46H
仅修改IP的内容
jmp某一合法寄存器
jmp ax (类似于mov IP, ax)
功能:用寄存器中的值修改IP
问题分析:CPU运行的流程
(初始:CS=2000H,IP=0000H)
- mov ax, 6622H ;ax=6622H
- jmp 1000:3 ;CS=1000,IP=3
- mov ax,0000 ;ax=0000H
- mov bx,ax ;bx=0000H
- jum bx ;IP=0000H
- mov ax,0123H ;ax=0123H
- 转到第三步执行(死循环 )
2.12 代码段
对于8086PC机,可以将长度为N(N<=64kb)的一组代码,存在一组地址连续、起始地址为16的倍数的内存单元,这段内存是用来存放代码的,从而定义了一个代码段。
例如:
这段长度为10字节的字节的指令,存在从123B0H123B9H的一组内存单元中,我们就可以认为,123B0H123B9H这段内存单元是用来存放代码的,是一个代码段,它的段地址为123BH,长度为10字节。
检测点2.3:
下面的3条指令执行后,CPU几次修改IP?都是什么时候?最后IP中的值是多少?
mov ax,bx
sub ax, ax
jmp ax
4次(第三次:读取jmp ax之后;第四次:执行jmp ax修改IP), ax=0000H,IP=ax;