当然可以!以下是 LC-3 中常见指令(汇编格式)与对应的二进制编码格式 的总结表,通俗易懂地介绍每条指令的用途、操作码(opcode)以及格式结构。
✅ 常见 LC-3 指令与对应的二进制格式
指令 | 名称 | 操作码(opcode) | 功能简述 | 二进制格式(概括) |
---|---|---|---|---|
ADD | 加法 | 0001 | 把两个数相加,结果存在寄存器中 | 0001 DDD SSS 0 00 TTT 或 0001 DDD SSS 1 IIIII |
AND | 位与 | 0101 | 把两个数进行按位与操作 | 0101 DDD SSS 0 00 TTT 或 0101 DDD SSS 1 IIIII |
NOT | 取反 | 1001 | 把一个数逐位取反 | 1001 DDD SSS 111111 |
LD | 直接取数 | 0010 | 从内存加载一个值到寄存器 | 0010 DDD PCoffset9 |
LDI | 间接取数 | 1010 | 通过指针地址取值 | 1010 DDD PCoffset9 |
LDR | 基址 + 偏移取数 | 0110 | 从基址寄存器加上偏移的位置取值 | 0110 DDD BBB offset6 |
LEA | 取地址 | 1110 | 把某个地址直接加载到寄存器中 | 1110 DDD PCoffset9 |
ST | 存储 | 0011 | 把寄存器的值存储到某个内存位置 | 0011 SSS PCoffset9 |
STI | 间接存储 | 1011 | 把值存到一个指针指向的位置 | 1011 SSS PCoffset9 |
STR | 基址 + 偏移存储 | 0111 | 把值存储到基址寄存器加偏移地址 | 0111 SSS BBB offset6 |
BR | 条件跳转 | 0000 | 根据条件码跳转(n,z,p) | 0000 n z p PCoffset9 |
JMP | 跳转 | 1100 | 跳转到寄存器指定的地址 | 1100 000 BBB 000000 |
JSR | 跳转子程序 | 0100 | 跳转到某个子程序地址并保存返回点 | 0100 1 PCoffset11 (JSR)或 0100 0 00 BBB 000000 (JSRR) |
TRAP | 系统调用 | 1111 | 调用操作系统功能 | 1111 0000 trapvect8 |
RET | 返回 | — | 返回调用者(其实是 JMP R7 ) | 1100 000 111 000000 |
HALT | 停机 | — | 停止程序执行(TRAP x25) | 1111 0000 0010 0101 |
🧠 示例讲解
➤ LD R1, LABEL
-
二进制格式:
0010 001 PCoffset9
-
意思是:从当前位置(PC)偏移某个值,到该地址加载值到
R1
。
➤ ADD R0, R1, #3
-
二进制格式:
0001 000 001 1 00011
-
意思是:
R0 = R1 + 3
➤ NOT R2, R3
-
二进制格式:
1001 010 011 111111
-
意思是:对
R3
取反,存入R2
📌 附加说明
-
DDD
:目的寄存器(Destination Register) -
SSS
,TTT
:源寄存器(Source Registers) -
PCoffset9
,PCoffset11
:9位/11位偏移量,用于跳转或加载 -
offset6
:6位有符号偏移量,用于LDR
、STR
-
trapvect8
:8位 TRAP 向量,例如 HALT 是x25
如果你需要,我还可以做一张图表或卡片版帮助你记忆这些指令。需要吗?