通过nemu指令执行过程理解程序是个状态机

一段程序在机器上运行起来后就是一个状态机,每个状态就是CPU的寄存器以及内存(RAM+外设IO寄存器),CPU每执行程序的一条指令,相应的状态都会进行跳转。也就是说,状态的跳转是CPU执行一条指令的结果,它具体可以表现为,物理内存(RAM)数据发生改变,IO设备发生相应行为(外设寄存器状态的改变,比如输出图像、声音)。

更进一步的,可以通过nemu的源代码看一次指令执行的过程:

  • 取指令。根据pc寄存器保存的指令地址取出指令(riscv32ISA下为固定长度的32位值),inst_fetch(&s->snpc, 4);
  • 译码。将取出的指令翻译成具体的行为,包括操作码(例如加减乘除,riscv32下均为[0:6]7位操作码)、操作数(例如立即数imm,源寄存器索引rs1、rs2,目的寄存器索引rd,它们具体在指令中的位置因指令类型而不同,例如,I type、R type、U type、B type、S type、J type);
  • 执行。CPU根据译码结果执行,在物理世界表现为逻辑电路的执行,nemu是模拟物理机器,所以在宿主机器上进行相应的运算即可。

译码和执行具体通过decode_exec(s)实现。