如何在 《图灵完备》 中设计一套高效的指令集
编辑
2
2025-03-13
《图灵完备》中我们设计出最基础的图灵完备计算机后,需要使用汇编语言对其进行编程,而一套好的指令集是高效编程的基础。
问题明确
我们现在对于计算机有如下操作:
IMMEDIATE
CALCULATION
COPY
CONDITION
共有六个寄存器,编号0-5
IMMEDIATE会写入 REM0
CALCULATION可以将 REM1和 REM2的值操作后存储到 REM3中
CONDIOTON会判断 REM3中的值是否满足条件,同时跳转 REM0中存储的值
COPY可以自由复制 REM0-REM5以及 IN/OUT的值
每次输入是一个八位二进制数,划分为 2 + 3 + 3,前两位代表操作:
00 -> IMEDIATE
01 -> COMPUTE
10 -> COPY
11 -> CONDITION
IMMEDIATE模式下,后六位数值即为读入数值;
CALCULATION模式下主要读入最后三位,有如下对应:
000 -> OR
001 -> NAND
010 -> NOR
011 -> AND
100 -> ADD
101 -> SUB
CONDITION模式下主要读入最后三位,有如下对应:
000 -> NEVER
001 -> =0
011 -> <=0
100 -> ALWAYS
101 -> !=0
110 -> >=0
111 -> >0
COPY将3-5位对应寄存器数据复制到6-8位对应寄存器,数值对应寄存器编号,且数值为6时为 IN/OUT
目前一个别名仅能对应一个二进制数字
基础设计方案
IN_Rx
| 指令 | 二进制编码 | 说明 |
|---|---|---|
| IN_R0 | 10 000 110 | 输入到R0 |
| IN_R1 | 10 001 110 | 输入到R1 |
| IN_R2 | 10 010 110 | 输入到R2 |
| IN_R3 | 10 011 110 | 输入到R3 |
| IN_R4 | 10 100 110 | 输入到R4 |
| IN_R5 | 10 101 110 | 输入到R5 |
OUT_Rx
| 指令 | 二进制编码 | 说明 |
|---|---|---|
| OUT_R0 | 10 110 000 | 输出R0 |
| OUT_R1 | 10 110 001 | 输出R1 |
| OUT_R2 | 10 110 010 | 输出R2 |
| OUT_R3 | 10 110 011 | 输出R3 |
| OUT_R4 | 10 110 100 | 输出R4 |
| OUT_R5 | 10 110 101 | 输出R5 |
MOV_RxRy
| 指令 | 二进制编码 | 说明 |
|---|---|---|
| MOV_R0R0 | 10 000 000 | 将R0复制到R0 |
| MOV_R0R1 | 10 000 001 | 将R0复制到R1 |
| MOV_R0R2 | 10 000 010 | 将R0复制到R2 |
| MOV_R0R3 | 10 000 011 | 将R0复制到R3 |
| MOV_R0R4 | 10 000 100 | 将R0复制到R4 |
| ... | ... | ... |
JMP (无条件)
| 指令 | 二进制编码序列 | 说明 |
|---|---|---|
| JMP_10 | label + 11 000100 | 无条件跳转到label行 |
JZ (如果R3为0则跳转)
相似于 JMP ,下列均相似,不再赘述
JNZ (如果R3不为0则跳转)
JLE (如果R3小于等于0则跳转)
JGE (如果R3大于等于0则跳转)
JG (如果R3大于0则跳转)
JL (如果R3小于0则跳转)
拓展指令
TODO
- 0
- 0
-
分享