在典型的指令周期中,获取、解码、执行一起形成一个周期。我的问题是关于解码步骤:解码的部分是什么,是指令的操作码吗?如果是,那么为什么要对其进行编码?
事实上,我理解解码这里的方法与安全领域中根据密钥解码消息的方法类似,这让我有点困惑。
答案1
解码意味着解析指令以确定其含义。
典型指令由操作码和(通常)一个或多个参数组成。这些参数可能引用特定的寄存器或内存地址,也可能是执行期间直接使用的立即值。此外,某些指令可能具有前缀(例如LOCK
在 x86 中)或功能代码(例如funct
某些 MIPS 指令的字段),这些前缀或功能代码会改变其功能。
在解码过程中,处理器需要:
对于现代处理器来说,这可能是一个复杂的操作,需要管道中的多个阶段。为了加快此过程,可以使用专用缓存来存储频繁执行的指令的微操作。
有关在现代处理器中实现高性能的技术的更多信息,你可能需要阅读这个答案。
答案2
除了操作码之外,汇编指令通常还具有指示寄存器和寻址模式(绝对、相对、自动增量等)的位字段。
解码是解释操作码和其他位域以确定指令将执行什么操作或执行其他操作的循环。
摘要:它找出指令的可选细节
NOP
例如:对于 8086 指令集,0x90 (二进制 10010000)通常被认为是无操作。
但是有一条XCHG
指令,表示为二进制 10010reg(reg=3 位),(0x90 + reg)是一条 16 位带有AX
指令的交换寄存器。表示为“reg”的 3 位定义要与哪个寄存器进行交换。
二进制 000 的 'reg' 表示 '与寄存器AX
'。因此 0x90 解码为“AX
与交换AX
”,这并没有起到什么作用,也就是无操作NOP
答案3
指令和寻址模式是解码的内容。指令 + 寻址模式由操作码和操作码后的任何立即数据(操作数)组成。
如果是这样,那为什么要对其进行编码呢?
因为我们使用 RAM 中的值来“代表”指令和寻址模式。必须存在一个方案,即 X = 任何指令 + 任何寻址模式。类似于 ASCII/Unicode 是一种“代表”数字、字母和终端控制代码的方案。
如果您的机器对每条可能的指令都配有 1 个开关,则解码步骤就没有必要了。这在“RAM 等效”中将是 8 位(或其他)字节中每位 1 条指令,如果启用了多个位,则所有指令(是的,您将被限制为 8 条指令)都将在该步骤“触发”。我相信 60 年代末/70 年代初的 PDP 组装与此相差不远。
事实上,我理解这里的解码方式与安全领域中用密钥解码消息的方式类似,这让我有点困惑。
不,它更像是将 MPEG 数据解码为原始视频数据 - 原始 MPEG 数据不能直接绘制在屏幕上,必须对其进行处理和“解包”才能找出其确切含义。
答案4
操作码只是一个数字,将 n 种不同的可能性打包成一个枚举。除了将操作码本身与寻址模式和选项分开之外,你真的将此操作 ID 解码为一组在实现硬件中具有实际意义的控制位。现代 CPU 甚至更加复杂,可能将一条汇编指令扩展为多条微操作。
您可以在 YouTube 上找到“从头开始”构建 CPU 的视频。