Skip to content
LC-3的指令
📆2022-03-12 | ✍2022-03-19 | 📂计算机架构

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

循环

程序映射到内存,分配的指令不会改写,这是循环的前提。循环利用跳转指令实现,大幅减少执行重复性任务的指令数量。

循环根据逻辑可分为两类:

  • 计数器循环:维护一个计数器,初始化、核对终止条件、增减。
  • 哨兵循环:仅提供终止条件码。

Last updated: