操作码扩展
假设一个机器的字长是16位
,指令长度为单字长
若4位
用于操作码OP
,剩下3个4位
用于地址码,则该指令是三地址指令,总共可以有16条
如果该机器的指令条数变多了(至少17条以上),那么4位的操作码是不够的,需要扩展
如果把Ad1
作为操作码,那么OP
就多出4位
,变成了8位
,就可以有256条
双地址指令了
但是扩展操作码时必须要遵守2个原则(不知道为什么)
不允许短操作码是长操作码的前缀(长短是相对的)
比如一个4位的操作码为
0100
(短操作码)和一个8位的操作码abcd efgh
(长操作码),abcd
不能是0100
每条指令的操作码不能重复
三地址指令如果是16条
,那么意味着前4位
已经占满,后续的位数再多,也是不合法的操作码
因此如果需要后续扩展,三地址指令必须至少留出一条
那么如果双地址指令不需要扩展,最多可以有16条
,如果需要扩展,则在Ad1
位置至少也要留出一条指令
如果双地址指令想要扩展的更多,那意味着单地址指令需要留出的条数也越多,单地址指令条数就越少
例题1
一个计算机系统采用32位单字长指令,地址码为12位,若定义了250条二地址指令,还可以有几条单地址指令?
指令单子长,则指令长度为
32
位
指令单子长,则指令长度为32位
指令单子长,则指令长度为32位
这个指令是从三地址扩展来的吗? 不是,因为如果是三地址,则至少要 12 x 3 = 36 位 这个指令是从三地址扩展来的吗?\\不是,因为如果是三地址,则至少要12x3=36位 这个指令是从三地址扩展来的吗?不是,因为如果是三地址,则至少要12x3=36位
二地址要用掉 24 位地址码,操作码还剩下 32 − 24 = 8 位,二地址指令可以有 256 条 二地址要用掉24位地址码,操作码还剩下32-24=8位,二地址指令可以有256条 二地址要用掉24位地址码,操作码还剩下32−24=8位,二地址指令可以有256条
但是题目说只用了 250 条,也就是可以有 6 条用于扩展 但是题目说只用了250条,也就是可以有6条用于扩展 但是题目说只用了250条,也就是可以有6条用于扩展
而单地址指令,意味着地址码只占 12 位,相对于二地址指令,操作码又多出了 12 位 而单地址指令,意味着地址码只占12位,相对于二地址指令,操作码又多出了12位 而单地址指令,意味着地址码只占12位,相对于二地址指令,操作码又多出了12位
所以单地址指令有: 6 × 2 12 = 24 K 条 所以单地址指令有:6×2^{12} = 24K \,条 所以单地址指令有:6×212=24K条
例题2
某计算机按字节编址,指令字长固定且只有两种指令格式,其中三地址指令29条,二地址指令107条,每个地址字段6位,则指令字长至少应该是?
三地址指令有
29
条,则至少为
5
位(
2
5
=
32
>
29
)
三地址指令有29条,则至少为5位(2^5 = 32 > 29)
三地址指令有29条,则至少为5位(25=32>29)
如果三地址刚好是 5 位,则有 32 − 29 = 3 条可以用于二地址指令扩展 如果三地址刚好是5位,则有32-29=3条可以用于二地址指令扩展 如果三地址刚好是5位,则有32−29=3条可以用于二地址指令扩展
地址码为 6 位,则二地址指令最多可以有 3 × 2 6 = 192 条 > 107 条 地址码为6位,则二地址指令最多可以有3×2^6 = 192条 > 107条 地址码为6位,则二地址指令最多可以有3×26=192条>107条
∴ 指令字长至少是 5 + 3 × 6 = 23 ∴指令字长至少是5+3×6 = 23 ∴指令字长至少是5+3×6=23
又 ∵ 计算机按字节编址 , 23 m o d 8 ≠ 0 又∵计算机按字节编址, \quad 23\mod8≠0 又∵计算机按字节编址,23mod8=0
∴ 指令字长至少是 24 位 ∴指令字长至少是24位 ∴指令字长至少是24位
例题 2 补充
- 3 地址指令 29 条,则 O P 1 OP_1 OP1 至少 5 位,其中 2 5 = 32 2^5=32 25=32,可以留出 32 − 29 = 3 32 - 29 = 3 32−29=3 条用于扩展二地址指令
- 对于二地址指令, O P 1 OP_1 OP1 是三地址指令未使用的操作码,有 3 条
- 二地址指令有
107
107
107 条,假设
O
P
2
OP_2
OP2 有
x
x
x 位,那么
3
×
2
x
=
107
,
x
=
⌈
l
o
g
2
107
3
⌉
=
6
3×2^x=107, x = \lceil log_2\frac{107}{3} \rceil= 6
3×2x=107,x=⌈log23107⌉=6
- 因此指令字长至少是 5 + 3 × 6 = 23 5+3×6 = 23 5+3×6=23 位,由于计算机按字节编址,指令字长至少是 24 24 24位