为什么 5 位最常为 0?
Why 5 bits are most often 0?
我研究了 MIPS,我发现如果指令不是移位指令,指令的 5 位总是 0。这似乎是资源浪费,是否必须这样做以加强所有指令具有相同长度的规律性的简单性?为什么移位指令不能长 5 位而其余指令使用这些位来处理更多溢出?
80 年代 MIPS 处理器问世时,它是最早的所谓 RISC 处理器之一,这是一个革命性的概念。当时的大多数处理器(8080 系列、8086 系列、Z80、6502、6800)都以高效的指令编码为目标,具有可变长度的指令(例如,它们可以采用 1、2、3 或 4 个字节)。这提供了良好的代码密度,但是,指令的解码和执行是一个状态机,状态的数量取决于确切的指令。
为了更快地执行,MIPS 处理器进行了革命性的改变:
- 所有指令都存储在一个 32 位字中
- 指令解码起来非常简单,大多数位应该直接映射到硬件
- 所有指令需要相同数量的 "states" 来执行
- "states"是在流水线而不是状态机中实现的,这意味着指令吞吐量是每条指令1个周期而不是N条(实际上流水线中同时有N条指令)
前两点是代码密度低的原因。 MIPS 故意让程序比它们应该花费更多 ROM/RAM space,以便更有效地执行它们。
终于ARM做了一件可以考虑的事情"best of both":可以在THUMB(更高的代码密度,更低的性能)和ARM(更高的性能,更低的代码密度,但还是比什么好很多)之间切换MIPS 做了)取决于每个例程的具体需要。这可能就是 ARM 如此流行和无所不在的原因。
我研究了 MIPS,我发现如果指令不是移位指令,指令的 5 位总是 0。这似乎是资源浪费,是否必须这样做以加强所有指令具有相同长度的规律性的简单性?为什么移位指令不能长 5 位而其余指令使用这些位来处理更多溢出?
80 年代 MIPS 处理器问世时,它是最早的所谓 RISC 处理器之一,这是一个革命性的概念。当时的大多数处理器(8080 系列、8086 系列、Z80、6502、6800)都以高效的指令编码为目标,具有可变长度的指令(例如,它们可以采用 1、2、3 或 4 个字节)。这提供了良好的代码密度,但是,指令的解码和执行是一个状态机,状态的数量取决于确切的指令。
为了更快地执行,MIPS 处理器进行了革命性的改变:
- 所有指令都存储在一个 32 位字中
- 指令解码起来非常简单,大多数位应该直接映射到硬件
- 所有指令需要相同数量的 "states" 来执行
- "states"是在流水线而不是状态机中实现的,这意味着指令吞吐量是每条指令1个周期而不是N条(实际上流水线中同时有N条指令)
前两点是代码密度低的原因。 MIPS 故意让程序比它们应该花费更多 ROM/RAM space,以便更有效地执行它们。
终于ARM做了一件可以考虑的事情"best of both":可以在THUMB(更高的代码密度,更低的性能)和ARM(更高的性能,更低的代码密度,但还是比什么好很多)之间切换MIPS 做了)取决于每个例程的具体需要。这可能就是 ARM 如此流行和无所不在的原因。