F4 计算机系统的状态机模型
处理器的组成和工作原理
F4.1.1 继续执行上述指令
尝试继续执行指令, 记录寄存器的状态变化过程. 你发现执行到最后时, 处理器处于什么样的状态? 上述数列的求和结果在哪个寄存器中?
1 | 0: li r0, 10 # 这里是十进制的10 |
状态机视角的寄存器状态变化:
1 | PC r0 r1 r2 r3 |
F4.1.2 计算10以内的奇数之和
尝试用上述指令编写一个程序, 求出10以内的奇数之和, 即计算
1+3+5+7+9. 编写后, 尝试列出处理器状态的变化过程, 以此来检查你编写的程序是否正确.
编写程序如下:
1 | 0: li r0, 11 |
处理器状态如下:
1 | PC r0 r1 r2 r3 |
指令集架构的状态机模型
见课件
C程序入门
F4.3.1 在线运行C程序
你可以在Compiler Explorer这个在线网站中运行上述C程序. 具体地, 在代码编辑器中输入上述C代码后, 点击编辑器上方工具栏的
Add new..., 选择Execution Only, 即可弹出执行结果的终端窗口. 如果你的操作正确, 你将看到终端窗口输出z = 3.你可以尝试按照你的理解修改C代码, 并观察程序的输出.
F4.3.2 继续执行上述程序
尝试继续执行上述代码, 记录状态的变化过程. 程序执行结束时, 程序处于什么样的状态?
1 | // 待执行的程序 |
状态:
1 | PC sum i |
数字电路的状态机模型
F4.4.1 从状态机视角理解数列求和电路的工作过程
在上一小节中, 你已经通过寄存器和加法器搭建出一个简单数列求和电路, 用于计算
1+2+...+10. 尝试列出电路状态的变化过程.
这个是上一节中搭建的用于数列求和的电路
我们将左边的寄存器视作状态A 右边的寄存器视作状态B,那么有状态:
1 | A B |
在计算机上执行C程序
F4.5.1 结合数列求和的例子理解编译器的工作
我们已经给出了数列求和的C程序和相应的指令序列, 尝试从状态机的视角理解它们之间的联系.
对比先前的C程序和指令序列的状态迁移过程,我们可以发现他们的在逻辑上等价的:
- 他们有着相同的初始状态
- 指令序列的寄存器状态 = C程序的变量状态
- 指令序列的PC值 = C程序的执行的行号
- 指令序列的转移规则 = C程序的语句
结合老师上课讲的内容,他们可以被视作是等价的。
F4.5.2 结合数列求和的例子理解编译器的工作
具体地, 点击编辑器上方工具栏的
Add new..., 选择Compiler, 即可弹出相应汇编代码的窗口. 汇编代码默认采用x86指令集, 你不一定能理解每一条指令的具体含义, 但通过背景颜色的高亮和鼠标移动, 你可以看到C程序片段和汇编代码片段之间的对应关系.