仿照哈夫曼树(或前缀编码,Prefix-free)的解法,目前先不解释具体怎么画了,直接放例题,大家自己慢慢品味吧。
【例 1】某指令系统指令长 16 位,操作码字段为 4 位,地址码字段为 4 位,采用扩展操作码技术,形成三地址指令 15 条、二地址指令 15 条、一地址指令 15 条、零地址指令 16 条。
【解】指令格式如下:
| OP |
A1 |
A2 |
A3 |
| 4 位 |
4 位 |
4 位 |
4 位 |
画出对应的树:
stateDiagram-v2
state if_state <>
[*] --> 【三地址】OP=0000~1110(15条)
[*] --> OP=1111
OP=1111 --> 【二地址】A1=0000~1110(15条)
OP=1111 --> A1=1111
A1=1111 --> 【一地址】A2=0000~1110(15条)
A1=1111 --> A2=1111
A2=1111 --> 【零地址】A3=0000~1111(16条)
沿着树的边一直走到叶子结点,可以得到如下格式的指令:
| 指令 |
操作码 |
地址码1 |
地址码2 |
地址码3 |
| 15 条三地址指令 |
0000 |
A1 |
A2 |
A3 |
| . |
0001 |
A1 |
A2 |
A3 |
| . |
... |
... |
... |
... |
| . |
1110 |
A1 |
A2 |
A3 |
| 15 条二地址指令 |
1111 |
0000 |
A2 |
A3 |
| . |
1111 |
0001 |
A2 |
A3 |
| . |
... |
... |
... |
... |
| . |
1111 |
1110 |
A2 |
A3 |
| 15 条一地址指令 |
1111 |
1111 |
0000 |
A3 |
| . |
1111 |
1111 |
0001 |
A3 |
| . |
... |
... |
... |
... |
| . |
1111 |
1111 |
1110 |
A3 |
| 16 条零地址指令 |
1111 |
1111 |
1111 |
0000 |
| . |
1111 |
1111 |
1111 |
0001 |
| . |
... |
... |
... |
... |
| . |
1111 |
1111 |
1111 |
1111 |
【例 2】某指令系统指令长 16 位,操作码字段为 4 位,地址码字段为 4 位,采用扩展操作码技术,形成三地址指令 15 条、二地址指令 12 条、一地址指令 63 条、零地址指令 16 条。
【解】指令格式如下:
| OP |
A1 |
A2 |
A3 |
| 4 位 |
4 位 |
4 位 |
4 位 |
画出对应的树:
stateDiagram-v2
state if_state <>
[*] --> 【三地址】OP=0000~1110(15条)
[*] --> OP=1111
OP=1111 --> 【二地址】A1=0000~1011(12条)
OP=1111 --> A1=1100
OP=1111 --> A1=1101
OP=1111 --> A1=1110
OP=1111 --> A1=1111
A1=1100 --> 【一地址】A2=0000~1111(16条)
A1=1101 --> 【一地址】A2=0000~1111(16条)
A1=1110 --> 【一地址】A2=0000~1111(16条)
A1=1111 --> 【一地址】A2=0000~1110(15条)
A1=1111 --> A2=1111
A2=1111 --> 【零地址】A3=0000~1111(16条)
沿着树的边一直走到叶子结点,可以得到如下格式的指令:
| 指令 |
操作码 |
地址码1 |
地址码2 |
地址码3 |
| 15 条三地址指令 |
0000 |
A1 |
A2 |
A3 |
| . |
0001 |
A1 |
A2 |
A3 |
| . |
... |
... |
... |
... |
| . |
1110 |
A1 |
A2 |
A3 |
| 12 条二地址指令 |
1111 |
0000 |
A2 |
A3 |
| . |
1111 |
0001 |
A2 |
A3 |
| . |
... |
... |
... |
... |
| . |
1111 |
1011 |
A2 |
A3 |
| 63 条一地址指令 |
1111 |
1100 |
0000 |
A3 |
| . |
1111 |
1100 |
0001 |
A3 |
| . |
... |
... |
... |
... |
| . |
1111 |
1100 |
1111 |
A3 |
| . |
1111 |
1101 |
0000 |
A3 |
| . |
1111 |
1101 |
0001 |
A3 |
| . |
... |
... |
... |
... |
| . |
1111 |
1111 |
1110 |
A3 |
| 16 条零地址指令 |
1111 |
1111 |
1111 |
0000 |
| . |
1111 |
1111 |
1111 |
0001 |
| . |
... |
... |
... |
... |
| . |
1111 |
1111 |
1111 |
1111 |
【例 3】某指令系统指令长 16 位,地址码字段为 6 位,采用扩展操作码技术,形成二地址指令 12 条、一地址指令 96 条、零地址指令 50 条。
【解】指令格式如下:
画出对应的树:
stateDiagram-v2
state if_state <>
[*] --> 【二地址】OP=0000~1011(12条)
[*] --> OP=1100
[*] --> OP=1101
[*] --> OP=1110
[*] --> OP=1111
OP=1100 --> 【一地址】A1=000000~111111(64条)
OP=1101 --> 【一地址】A1=000000~011111(32条)
OP=1101 --> A1=100000
A1=100000 --> 【零地址】A2=000000~110001(50条)
【例 4】某指令系统指令长 12 位,操作码字段为 3 位,地址码字段为 3 位,采用扩展操作码技术,形成二地址指令 4 条、一地址指令 8 条、零地址指令 150 条。
【解】指令格式如下:
| OP |
A1 |
A2 |
A3 |
| 3 位 |
3 位 |
3 位 |
3 位 |
画出对应的树:
stateDiagram-v2
state if_state <>
[*] --> 【二地址】OP=000~011(4条)
[*] --> OP=100
[*] --> OP=101
[*] --> OP=110
[*] --> OP=111
OP=100 --> 【一地址】A1=000~111(8条)
OP=101 --> A1=000~111(8种)
OP=110 --> A1=000~111(8种)
OP=111 --> A1=000
OP=111 --> A1=001
OP=111 --> A1=010
A1=000~111(8种) --> 【零地址】A2=000~111(8条)
A1=000 --> 【零地址】A2=000~111(8条)
A1=001 --> 【零地址】A2=000~111(8条)
A1=010 --> 【零地址】A2=000~101(6条)
【例 5】某指令系统指令长 16 位,地址码字段为 6 位,采用扩展操作码技术,如果已定义了 12 条二地址指令,则最多还可定义多少条一地址指令?
【解】指令格式如下:
画出对应的树:
stateDiagram-v2
state if_state <>
[*] --> 【二地址】OP=0000~1011(12条)
[*] --> OP=1100
[*] --> OP=1101
[*] --> OP=1110
[*] --> OP=1111
OP=1100 --> 【一地址】A1=000000~111111(64条)
OP=1101 --> 【一地址】A1=000000~111111(64条)
OP=1110 --> 【一地址】A1=000000~111111(64条)
OP=1111 --> 【一地址】A1=000000~111111(64条)
所以最多还可定义 \(4 \times 2^6 = 256\) 条一地址指令。
【例 6】某指令系统指令长 32 位,地址码字段为 12 位,采用扩展操作码技术,如果已定义了 250 条二地址指令,则最多还可定义多少条一地址指令?
【解】指令格式如下:
画出对应的树:
stateDiagram-v2
state if_state <>
[*] --> 【二地址】OP=0000,0000~1111,1001(250条)
[*] --> OP=1111,1010
[*] --> OP=1111,1011
[*] --> OP=1111,1100
[*] --> OP=1111,1101
[*] --> OP=1111,1110
[*] --> OP=1111,1111
OP=1111,1010 --> 【一地址】A1=000000,000000~111111,111111(2^12条)
OP=1111,1011 --> 【一地址】A1=000000,000000~111111,111111(2^12条)
OP=1111,1100 --> 【一地址】A1=000000,000000~111111,111111(2^12条)
OP=1111,1101 --> 【一地址】A1=000000,000000~111111,111111(2^12条)
OP=1111,1110 --> 【一地址】A1=000000,000000~111111,111111(2^12条)
OP=1111,1111 --> 【一地址】A1=000000,000000~111111,111111(2^12条)
所以最多还可定义 \(6 \times 2^{12} = 24K\) 条一地址指令。
【例 7】(2022 年统考真题)设计某指令系统时,假设采用 16 位定长指令字格式,操作码使用扩展编码方式,地址码为 6 位,包含零地址、一地址和二地址 3 种格式的指令。若二地址指令有 12 条,一地址指令有 254 条,则零地址指令的条数最多为( )。
A. 0
B. 2
C. 64
D. 128
【解】指令格式如下:
画出对应的树:
stateDiagram-v2
state if_state <>
[*] --> 【二地址】OP=0000~1011(12条)
[*] --> OP=1100
[*] --> OP=1101
[*] --> OP=1110
[*] --> OP=1111
OP=1100 --> 【一地址】A1=000000~111111(64条)
OP=1101 --> 【一地址】A1=000000~111111(64条)
OP=1110 --> 【一地址】A1=000000~111111(64条)
OP=1111 --> 【一地址】A1=000000~111101(62条)
OP=1111 --> A1=111110
OP=1111 --> A1=111111
A1=111110 --> 【零地址】A2=000000~111111(64条)
A1=111111 --> 【零地址】A2=000000~111111(64条)
所以最多还可定义 \(2 \times 2^6 = 128\) 条零地址指令,本题选 D。
【例 8】(2017 年统考真题)某计算机按字节编址,指令字长固定且只有两种指令格式,其中三地址指令 29 条,二地址指令 107 条,每个地址字段为 6 位,则指令字长至少应该是( )
A. 24 位
B. 26 位
C. 28 位
D. 32 位
【解】三地址指令条数满足 \(29 < 2^5 = 32\),因此推断操作码字段 OP 至少为 5 位,指令格式可能如下:
| OP |
A1 |
A2 |
A3 |
| 5 位 |
6 位 |
6 位 |
6 位 |
画出对应的树:
stateDiagram-v2
state if_state <>
[*] --> 【三地址】OP=00000~11100(29条)
[*] --> OP=11101
[*] --> OP=11110
[*] --> OP=11111
OP=11101 --> 【二地址】A1=000000~111111(64条)
OP=11110 --> 【二地址】A1=000000~111111(64条)
OP=11111 --> 【二地址】A1=000000~010100(21条)
所以指令字长至少有 \(5 + 3 \times 6 = 23\) 位,又因为计算机按字节编址,所以取成 24 位即 3 字节,本题选 A。