當然可以!以下是 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
如果你需要,我還可以做一張圖表或卡片版幫助你記憶這些指令。需要嗎?