现在只希望助教别在Github上搜到这些代码然后认定我抄袭 (我抄我自己???)
LC-3出自《计算机系统概论(第二版)》一书,是一个图灵完备的16位计算机,内置了210*16 bit的内存和8个16位的寄存器。
指令集如下图:
为了为下文的介绍做铺垫,先介绍一些理解交互操作所需的程序变量:
变量名 | 含义 |
---|---|
内存地址 | 数据在内存中的地址,范围 0~210-1 |
内存内容 | 内存中存储的内容,在LC-3的实现中不严格区分指令和数据 |
PC | program counter,指向当前执行的指令在内存中的地址 |
cur | 光标(cursor),表示当前被数码管显示的内存地址 |
cnt | counter,用来计数执行的指令条数 |
mod | 交互模式状态代码 |
state | 内核状态机状态代码 |
注:其实整个LC-3中只有一个有限状态机,但为了方便理解和编写代码,将状态机的状态代码分为了mod
和state
两部分,这种表述与只用一个状态变量是等价的。
下面进行详细介绍。
为了方便与用户的交互,LC-3 Simulator总共设计了4种模式:
状态 | 功能 | 状态代码 |
---|---|---|
Write | 写入 | 00 |
Jump | 跳转 | 10 |
Run | 运行 | 01 |
(Undefined) | (未定义) | 11 |
LC-3 的内核,也就是执行程序的核心部分,使用有限状态自动机进行描述。共有32种状态,下面介绍一些关键的状态:
state | 描述 |
---|---|
0 | 停机状态 |
1 | 将内存的写使能信号置为0 |
2 | 取指令,PC加一,同时检查PC是否为非法值,如果是,跳转到状态0(停机) |
显示部分使用的是板载的数码管和LED灯:
-
数码管
- 始终显示的是当前光标所在行的地址和内容,二者均使用16进制表示。
-
LED灯
-
在Write状态下
- 显示的是PC值(这样设置主要是为了方便调试);
-
在其他状态下
- 左侧9位显示的是指令执行总条数的数值(cur)
- 中间5位显示的是当前的LC-3内核自动机的状态代码(state)
- 右边两位显示的是当前的交互模式代码(mod)
-
可供操作的有五个按钮和16个开关。
可以使用上下左右中5个按钮进行操控:
按钮 | 作用 |
---|---|
上 | 在Write 和Jump 模式下用来使cur 减一 |
下 | 在Write 和Jump 模式下用来使cur 加一 |
左 | 用来在Write 和Jump 模式间相互切换,或强制终止运行(Run-->Write ) |
右 | 将SW 赋值给PC ,并开始执行,切换到Run 模式 |
中 | 确定键,Write 模式下将SW 赋值给cur 指向的内存空间,Jump 模式下将SW 赋值给cur |