位宽:16
寄存器数:4+4+4=12
真寄存器:AX、BX、CX、DX、PC、MAR、MDR、IR、sp_A、sp_B、sp_C、imm
伪寄存器:acc、sh、se、cmp、RAM
形式寄存器:R1、R2、R3
子部件:CM、uPC)
输入:指令译码器【微地址】、立即数标志
输出:控制信号(上升沿之后才有效)、形式寄存器号
CLK:正向
根据寄存器号,找到寄存器。根据CU给定的形式寄存器,施加控制信号
子部件:74138、寄存器
输入:形式寄存器号、实际寄存器号
输出:寄存器控制信号
翻译并拆解IR中的指令。取指完成后一直有效。
子部件:???
输入:IR
输出:微地址(uAddr)、立即数标志、实际寄存器号
输入:DataBus
输出:DataBus
控制(来自寄存器使能器):r(i), w(i)
CLK:反向
输入:DataBus
输出:主存
约定存取基本单位为一个字(16bit)
输入:MAR、DataBus
输出:DataBus
输入:sp_A、sp_B
输出:DataBus
控制:r(acc)、ALU(..)
输入:sp_A、sp_B
输出:DataBus
控制:r(cmp)、CMP(..)
输入:sp_A、sp_B
输出:DataBus
控制:r(sh)、SH(..)
输入:sp_A、sp_B、sp_C
输出:DataBus
控制:r(se)、SE(..)
基于MIPS16的缩减版本,以下操作数均视为无符号数,立即数全部认为是低6位。
寻址格式+地址标记占3位 000~110 表示寄存器 111 表示立即数,立即数在PC指令的下一个地址中,且无论是几地址指令,最多使用一个立即数,目的寄存器不可以是立即数
指令名称 | 15..9 | 8..6 | 5..3 | 2..0 | 含义 | 注 |
---|---|---|---|---|---|---|
sllv | 0A | R1 | R2 | R3 | R1<= R2 << R3 | shift left logic |
srlv | 0D | R1 | R2 | R3 | R1<= R2 >> R3 | v=val |
sltu | 10 | R1 | R2 | R3 | R1<= (R2 < R3 ? 1 : 0) | ?less? |
addu | 13 | R1 | R2 | R3 | R1<= R2 + R3 | u=unsigned |
subu | 16 | R1 | R2 | R3 | R1<= R2 - R3 | |
and | 19 | R1 | R2 | R3 | R1<= R2 & R3 | |
or | 1C | R1 | R2 | R3 | R1<= R2 | R3 | |
xor | 1F | R1 | R2 | R3 | R1<= R2 ^ R3 | |
nxor | 22 | R1 | R2 | R3 | R1<= ~(R2^R3) | not XOR |
jz | 25 | 100 | R2 | R3 | PC<= (R2 ? PC : R3) | jump zero |
ld | 29 | R1 | 100 | R3 | R1<= [R3] | load |
str | 2C | 100 | R2 | R3 | [R2]<= R3 | store |
mov | 30 | R1 | 100 | R3 | R1 <= R3 | |
halt | 7F | 111 | 111 | 111 | stop | 停机 |
指令名称 | 示例 | 等效形式 | 注 |
---|---|---|---|
nop | NOP | sllv R1,R1,0 | |
mov | MOV AX,BX | sllv AX,BX,0 | |
cmp | CMP AX,BX,CX | nxor AX,BX,CX | 在非0意义下等价 |
假设RAM按字寻址
微地址 | 功能 | IS指令 | 节拍 | 动作 | 字节码 |
---|---|---|---|---|---|
00 | 取指 | / | 1 | r(PC); w(MAR) | |
01 | 取指 | / | 2 | r(PC); w(sp_A) | |
02 | 取指 | / | 3 | ALU(A+1); r(acc); w(PC) | |
03 | 取指 | / | 4 | r(RAM); w(IR); jmp(i) | |
05 | 取立即数 | / | 5 | r(PC); w(MAR) | |
05 | 取立即数 | / | 6 | r(PC); w(sp_A) | |
06 | 取立即数 | / | 7 | ALU(A+1); r(acc); w(PC) | |
07 | 取立即数 | / | 8 | r(RAM); w(imm); jmp(f) | |
0A | sllv | 1 | r[R3]; w(sp_A) | ||
0B | sllv | 2 | r[R2]; w(sp_B) | ||
0C | sllv | 3 | SH(l); r(sh); w[R1]; jmp(0) | ||
0D | srlv | 1 | r[R3]; w(sp_A) | ||
0E | srlv | 2 | r[R2]; w(sp_B) | ||
0F | srlv | 3 | SH(r); r(sh); w[R1]; jmp(0) | ||
10 | sltu | 1 | r[R3]; w(sp_B) | ||
11 | sltu | 2 | r[R2]; w(sp_A) | ||
12 | sltu | 3 | CMP(A<B); r(cmp); w[R1]; jmp(0) | ||
13 | addu | 1 | r[R3]; w(sp_B) | ||
14 | addu | 2 | r[R2]; w(sp_A) | ||
15 | addu | 3 | ALU(A+B); r(acc); w[R1]; jmp(0) | ||
16 | subu | 1 | r[R3]; w(sp_B) | ||
17 | subu | 2 | r[R2]; w(sp_A) | ||
18 | subu | 3 | ALU(A-B); r(acc); w[R1]; jmp(0) | ||
19 | and | 1 | r[R3]; w(sp_B) | ||
1A | and | 2 | r[R2]; w(sp_A) | ||
1B | and | 3 | ALU(A&B); r(acc); w[R1]; jmp(0) | ||
1C | or | 1 | r[R3]; w(sp_B) | ||
1D | or | 2 | r[R2]; w(sp_A) | ||
1E | or | 3 | ALU(A|B); r(acc); w[R1]; jmp(0) | ||
1F | xor | 1 | r[R3]; w(sp_B) | ||
20 | xor | 2 | r[R2]; w(sp_A) | ||
21 | xor | 3 | ALU(A^B); r(acc); w[R1]; jmp(0) | ||
22 | xnor | 1 | r[R3]; w(sp_B) | ||
23 | xnor | 2 | r[R2]; w(sp_A) | ||
24 | xnor | 3 | ALU(A xnor B); r(acc); w[R1]; jmp(0) | ||
25 | jz | 1 | r[R2]; w(sp_C) | ||
26 | jz | 2 | r[R3]; w(sp_A) | ||
27 | jz | 3 | r(PC); w(sp_B) | ||
28 | jz | 4 | SE(0); r(se); w(PC); jmp(0) | ||
29 | ld | 1 | r[R3]; w(MAR) | ||
2A | ld | 2 | |||
2B | ld | 3 | r(RAM); w[R1]; jmp(0) | ||
2C | str | 1 | r[R2]; w(MAR) | ||
2D | str | 2 | r[R3]; w(RAM); | ||
2E | str | 3 | jmp(0) | ||
30 | mov | 1 | r[R3]; w[R1] | ||
N/A | halt | N/A | N/A |
动作 | 位 | 备注 |
---|---|---|
r[..]+r(..) | 0..3 | 寄存器 |
w[..]+w(..) | 4..7 | 寄存器 |
ALU(..) | 8..13 | 74181 |
SH(..) | 16..17 | 01左移00右移 |
CMP(..) | 18..19 | 01小于10等于11小等 |
SE(..) | 20..21 | 00:0跳A,1跳B |
jmp(..) | 22..23 | 00不跳01条件10强跳11清零 |
G | / | 停机 |
下表中对应位=1表示激活
值 | 寄存器 | 备注 |
---|---|---|
0 | [R1] | 形式寄存器 |
1 | [R2] | 形式寄存器 |
2 | [R3] | 形式寄存器 |
3 | PC | |
4 | MAR | |
5 | MDR | |
6 | IR | |
7 | sp_A | |
8 | sp_B | |
9 | sp_C | |
A | imm | |
B | acc | |
C | cmp | |
D | sh | |
E | se | |
F | RAM |
MOV AX, .ad1
LD BX, AX
ADD BX, BX, AX
MOV CX, 0
.loop
ADD AX, AX, 1
LD DX, AX
ADD CX, CX, DX
CMP DX, AX, BX
JZ DX, .loop
STR .ad2, CX
HALT
.ad1
5
1
3
5
6
8
.ad2