目前我们向我们的智能芯片添加的规则有:
规则一.可以处理NOP指令,指令长度为1个字节
规则二.可以处理JMP指令,指令长度为3个字节,后两个字节为要跳转的物理内存地址
规则三.可以从物理内存中读取指令并且执行
规则四.存在一个指令指针寄存器IP,用于指示要读取的物理内存地址
规则五.如果当前执行的是NOP指令,IP=IP+1
规则六.如果当前执行的是JMP指令,IP=(JMP指令的后两个字节)
规则七.IP内容改变时到物理内存中取指令
规则八.存在一个寄存器SP,用于指示内存的某个地址
规则九.可以处理MOV指令,可以把寄存器的内容保存到物理内存中(比如 MOV [0x0050], SP),也可以把内存中的内容加载到寄存器(比如 MOV SP, [0x0050]),也可以给寄存器赋值(比如 MOV SP, 1234), 指令长度3个字节
规则十.可以处理IRET指令,指令执行时自动把SP指向的物理内存中的值赋给IP, 指令长度1个字节
规则十一.智能芯片的外部有个输入引脚,当该引脚的电平从低变化到高时,打断指令的执行,自动把当前IP的值保存到SP指向的物理内存中,并且IP的内容自动变成0x0000
初始时我们安排:
寄存器SP的内容为0x0050
寄存器IP的内容为0x1000
物理内存内容为:
0x0000: MOV SP, 0x0050+((SP-0x0050)+2)%4
0x0003: IRET
.
.
.
0x0050: 0x00
0x0051: 0x10
0x0052: 0x00
0x0053: 0x20
.
.
.
0x1000: nop
0x1001: nop
0x1002: nop
0x1003: nop
0x1004: nop
0x1005: nop
0x1006: jmp 0x1000
.
.
.
0x2000: nop
0x2001: nop
0x2002: nop
0x2003: nop
0x2004: nop
0x2005: nop
0x2006: jmp 0x2000
规则十一中的外部引脚接一个定时器,每隔一定的时间产生电平由高到低的变化
运行开始以后,我们的智能芯片就可以在两段指令序列之间切换运行了
根据这十一条规则我们可以在我们的智能芯片上运行多个上述指令序
比如我们现在有三段上述的指令序列要同时运行,可以安排内存的内容如下:
0x0000: MOV SP, 0x0050+((SP-0x0050)+2)%6
0x0003: IRET
.
.
.
0x0050: 0x00
0x0051: 0x10
0x0052: 0x00
0x0053: 0x20
0x0054: 0x00
0x0055: 0x30
.
.
.
0x1000: nop
0x1001: nop
0x1002: nop
0x1003: nop
0x1004: nop
0x1005: nop
0x1006: jmp 0x1000
.
.
.
0x2000: nop
0x2001: nop
0x2002: nop
0x2003: nop
0x2004: nop
0x2005: nop
0x2006: jmp 0x2000
.
.
.
0x3000: nop
0x3001: nop
0x3002: nop
0x3003: nop
0x3004: nop
0x3005: nop
0x3006: jmp 0x3000
注意三段指令序列的内存内容与两段指令序列的内存内容有何区别
这就是多任务操作系统最基本的分时调度原理