段的概念
内存并没有分段,段的划分来自于CPU。
段地址*16必然是16的倍数,所以一个段的起始地址也一定是16的倍数;偏移地址为16位,16位地址的寻址能力为64KB,所以一个段的长度最大为64KB。
CPU可以用不同的段地址和偏移地址形成同一个物理地址。
CS(段寄存器)和IP(指令指针寄存器)
CS:代码段寄存器
IP:指令指针寄存器
在8086PC中,任意时刻设CS中的内容为M,IP中的内容为N,8086PC将从内存M*16+N单元开始,读取一条指令并执行。即:CPU将CS:IP指向的内容当作指令执行。
读取一条指令后,IP中的值自动增加,以使CPU可以读取下一条指令,根据指令的长度增加。
8086CPU的工作原理:
1)从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器。
2)IP = IP + 所读取指令的长度,从而指向下一条指令。
3) 执行指令。转到步骤(1),重复这个过程。
CPU将CS:IP指向的内存单元中的内容看作指令,因为,在任何时候,CPU将CS、IP中的内容当作指令的段地址和偏移地址,用它们合成指令的物理地址,到内存中读取指令码,执行。
修改CS、IP的指令
mov指令被称为传送指令。
mov指令不能用于设置CS、IP的值。
修改CS、IP的内容的指令被统称为转移指令。jmp指令。
jmp格式:(当前格式只能在Debug中使用,汇编编译器无法识别)
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 某以合法寄存器
功能为:用寄存器中的值修改IP。
代码段
要让CPU执行我们的放在代码段中的指令,必须要将CS:IP指向所定义的代码段中的第一条指令的首地址。
注意:指令的机器码读入的时候,此时指令还没执行,但是IP的值已经指向下一条指令的地址了。即:读取指令 -> IP地址指向下一条指令 -> CPU执行读取的指令