CPU如何区分指令和数据
1.问题引出
由于指令和数据均是以二进制形式主要存储与内存中,因此,CPU需要对所读取内存中的内容加以区分。为了解决CPU是如何区分指令和数据的问题,我们引入段地址寄存器CS和偏移地址寄存器IP。
2.CS和IP
CS和IP是8086CPU中两个关键的寄存器,它们指示了要读取指令的地址。其中CS为段寄存器,IP为指令寄存器。
现在,设任意时刻CS中的内容为M,IP中的内容为N,8086CPU将从物理内存地址为M×16+N单元开始,逐个读取指令并执行。
3.指令执行过程
- CPU从CS:IP所指向的内存单元读取指令,放入指令缓存器中;
- IP= IP+ 所读指令的长度,从而指向下一条指令;
- 执行指令缓存器中的内容,回到步骤一
上述指令执行过程 设计的目的是为了实现 CALL指令
4.修改CS:IP指令
1.jmp指令: jmp 段地址:偏移地址 可同时修改cs、ip中的内容,该指令的功能为:用指令给出的段地址修改CS,偏移地址修改IP。
jmp 2000:0010, 执行指令后:CS=2000H,IP=0010H,CPU将从20010H处读取指令
2.jmp指令仅修改IP的内容: 形如"jmp 某一合法寄存器"的指令可完成仅IP内容的修改。
#设原有CS=037F, IP=0000,执行下述指令:
mov ax,1000H
jmp ax
#执行指令后:CS=037F,IP=1000H
5.示例演示:
以下实验使用DOSBox和debug工具进行演示。
1.使用e指令修改2000:0000内存处的机器码,修改CS和IP地址,使用CPU执行相应机器码。
2.CPU是如何执行指令的:
通过实际编写指令,深入理解CPU指令执行的过程。
下面三条指令执行后,CPU几次修改了IP?分别在什么时候修改了IP?最后IP的值为多少
mov ax,bx
sub ax,ax
jmp ax
分析:
mov ax,bx --存方指令到寄存器中—>修改IP—>执行指令
sub ax,ax --存方指令到寄存器中—>修改IP—>执行指令
jmp ax --存方指令到寄存器中—>修改IP(IP=IP+指令长度)—>执行指令—>修改IP(jmp指令修改)
答案:
CPU 4 次修改了IP;
见分析;
IP最终值为 IP=0
6.参考资料
1.王爽老师的《汇编语言》;
2.哔哩哔哩视频讲解:https://www.bilibili.com/video/BV1mt411R7Xv?p=47