ISA
内存组成
最小寻址段为16bit,即LC-3的字大小,又称字寻址。
寄存器集
可在一个时钟周期内访问的临时储存位置。
LC-3共有8个普适寄存器(GPR),存储空间皆为一字。
或称寄存器文件。
指令集
ADD |0 0 0 1| DR | SR1 |0| 00 | SR2 |
ADD |0 0 0 1| DR | SR1 |1| imm5 |
AND |0 1 0 1| DR | SR1 |0| 00 | SR2 |
AND |0 1 0 1| DR | SR1 |1| imm5 |
BR |0 0 0 0|n|z|p| PCoffset9 |
JMP |1 1 0 0| 000 |BaseR | 000000 |
JSR |0 1 0 0|1| PCoffset11 |
JSRR |0 1 0 0| 0|00|BaseR| 000000 |
LD |0 0 1 0| DR | PCoffset9 |
LDI |1 0 1 0| DR | PCoffset9 |
LDR |0 1 1 0| DR |BaseR| offset6 |
LEA |1 1 1 0| DR | PCoffset9 |
NOT |1 0 0 1| DR | SR | 111111 |
RET |1 1 0 0| 000 | 111 | 000000 |
RTI |1 0 0 0| 000000000000 |
ST |0 0 1 1| SR | PCoffset9 |
STI |1 0 1 1| SR | PCoffset9 |
STR |0 1 1 1| SR |BaseR| offset6 |
TRAP |1 1 1 1| 0000| trapvector8 |
操作码 & 数据类型
操作码根据其支持的数据类型翻译比特模式。
寻址模式
指出操作对象所在的机制。
操作对象可以位于内存、寄存器里,或作为指令的一部分(即时值/字面值)。
分成三类:PC-相关,间接求值,基底+偏移量。
条件码
条件码用于帮助控制指令核对执行条件。
LC-3有三个条件码:
- N:负数
- Z:〇
- P:正数
它们由三个1bit寄存器分别储存,内部使用0/1表示否/是状态。
当GPR被一次操作或加载指令覆写时,条件码随之发生相应变化。
例如,GPR内的结果为负,则N置1,Z和P清0。
运算指令
ADD
Ins[5] = 0,指出第二个操作对象的来源在R6,即Ins[2:0]的二进制码。
ADD R6 R2 R6
|0 0 0 1|1 1 0|0 1 0|0|0 0|1 1 0|
Ins[5] = 1,指出第二个操作对象通过符号扩展Ins[4:0]获取。
ADD R6 R2 imm
|0 0 0 1|1 1 0|0 1 0|1|0 0 1 1 0|
Ins[11:9]指向运算结果的寄存器,此处为R6。
AND
下面演示初始化R2:
AND R2 R3 imm
|0 1 0 1|0 1 0|0 1 1|1|0 0 0 0 0|
使用R3的数据,与Ins[4:0]的即时数据,运算结果全0加载到R2。
Ins[5] = 0 是双输入寻址;Ins[5] = 1 是即时模式。
数据移动指令
从内存移动信息至寄存器的过程称为加载;从寄存器移动信息至内存的过程称为储存。
数据移动指令Ins[8:0]为数据生成位,用于寻址模式下计算目标地址。
LEA
全称Load Effective Address。
该指令不访问内存,只是加载算好的地址到寄存器。
LEA善于用离它很近的地址初始化寄存器。
示例:
LEA R5 -3
|1 1 1 0|1 0 1|1 1 1 1 1 1 1 0 1|
假设PC的值为x4019,则此命令会将x4019 - 3 = x4016
加载到R5。
特别注意,LEA不影响条件码。
PC相关模式
此模式下,目标地址不能离指令的内存位置太远,即offset ∈ [-255, +256]
。
LD
全称load。
LD的寻址模式是PC + offset
。
示例:
LD R2 198
|0 0 1 0|0 1 0|0 1 1 0 0 0 1 1 0|
令PC的值加上198,计算出目标地址,加载其位置的值到R2。
ST
全称store。
ST的寻址模式是PC + offset
。
示例:
ST R2 198
|0 0 1 1|0 1 0|0 1 1 0 0 0 1 1 0|
将R2的值写入内存上地址为PC + 198
的位置。
间接模式
移动地址之地址。
LDI
示例:
LDI R3 x1CC
|1 0 1 0|0 1 1|1 1 1 0 0 1 1 0 0|
假设:指令位于x4A1B;PC含有x4A1C;x49E8处内容为x2110。
Ins[9:0] = x1CC 经SEXT得xFFCC,则目标地址为x4A1C + xFFCC = x49E8
。此结果加载到MAR,读取内存复得x2110。凭此再读取内存,目标操作对象载入MDR。最终,MDR的内容加载到R3。条件码也发生相应变化。
基底 + 偏移量
使用基底寄存器的值加上偏移字面值,得到目标地址。
此模式能够读取内存的任何一处。
LDR
示例:
LDR R1 R2 x1D
|0 1 1 0|0 0 1|0 1 0|0 1 1 1 0 1|
假设:基底R2的值是x2345;x2362处内容为x0F0F。
Ins[5:0] = x1D 经SEXT得x001D,则目标地址为x2345 + x001D = x2362
。此结果加载到MAR,读取内存复得x0F0F。凭此再读取内存,目标操作对象载入MDR。最终,MDR的内容加载到R1。条件码也发生相应变化。
控制指令
中断执行流,进行某些操作。
类型有:
- 条件分支
- 无条件跳跃
- 子程序调用(函数)
- 服务调用
- RTI (Return from TRAP or Interrupt)
BR
条件分支
在EVALUATE ADDRESS阶段,按PC相关寻址模式求出新地址。在EXECUTE阶段,处理器核对BR中为1的条件码。若满足,就用新地址覆写PC。
示例:
假设:上一指令为ADD,且加载到GPR的结果是负数,故条件码N置1,Z、P清0;PC含有x36CA。
BR 条件 -6
|0 0 0 0|1 0 1|1 1 1 1 1 1 0 1 0|
EVALUATE ADDRESS阶段,求出新地址x36CA - 6 = x36C4
。
EXECUTE阶段,核对置1条件码,发现N = 1
满足n = 1
。用x36C4覆写PC。
无条件分支
当Ins[11:9] = 111
,无条件改变执行流,与上一指令的结果无关。
示例:
BR 条件 x185
|0 0 0 0|1 1 1|1 1 0 0 0 0 1 0 1|
JMP
BR的跳转范围有限,因为offset ∈ [-255, +256]
。
JMP是纯跳转命令,按间接模式寻址,不带偏移量。
示例:
JMP R2
|1 1 0 0|0 0 0|0 1 0|0 0 0 0 0 0|
假设:R2含有x6600。
在EXECUTE阶段,位于x6600的指令被加载到PC。
服务调用 —— TRAP
该指令允许程序向操作系统求助,它依靠陷阱矢量(8bit)辨识程序所需援助。
常见援助及相应陷阱矢量:
- 从键盘输入字符 —— x23
- 输出字符到显示器 —— x21
- 停止程序 —— x25
循环
程序映射到内存,分配的指令不会改写,这是循环的前提。循环利用跳转指令实现,大幅减少执行重复性任务的指令数量。
循环根据逻辑可分为两类:
- 计数器循环:维护一个计数器,初始化、核对终止条件、增减。
- 哨兵循环:仅提供终止条件码。