xy0v0's Blog

xy0v0's Blog

如何在 《图灵完备》 中设计一套高效的指令集

2025-03-13

《图灵完备》中我们设计出最基础的图灵完备计算机后,需要使用汇编语言对其进行编程,而一套好的指令集是高效编程的基础。

问题明确

我们现在对于计算机有如下操作:

IMMEDIATE
CALCULATION
COPY
CONDITION

共有六个寄存器,编号0-5
IMMEDIATE会写入 REM0
CALCULATION可以将 REM1REM2的值操作后存储到 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