我读到x86 CPU的可变指令长度为1到15个字节。另一方面,还写出x86字长为32位,这意味着所有寄存器,包括保存实际指令的指令寄存器,都是32位宽(4字节)。
这意味着指令可以比指令寄存器更宽。这怎么样?此外,我了解到在执行指令后,不跳转,指令计数器增加4.这意味着它假设每条指令长4个字节。这怎么回事?
我希望有人能为我澄清这一点。
答案 0 :(得分:1)
x86有一个非常复杂的操作码解析器,具有多个状态。首先,它查找遗留前缀,如REP
,LOCK
,地址和操作数覆盖前缀,可能只是设置内部标志。然后它查找强制和rex前缀,并可能设置其他内部标志。在此之后,解析器需要实际指令...或0x0f前缀以获得更多指令。即使这个指令字节可能包含其他数据,例如寄存器也可以在那里编码,因此根据指令的最高三位(0bxxx .....),解析器必须决定指令是否编码寄存器(例如, 0b000xxx110:push xxx
,其中xxx为es
,cs
,ss
或ds
)。根据指令,解析器然后查找ModR / M字段并对其进行评估。当这个ModR / M字段指示时,有一个SIB字段,然后,猜测是什么?,它评估SIB字段。取决于指令,ModR / M-field或SIB-field,最后可能存在立即偏移和/或立即值。
我不知道,处理器实际上是如何存储这些东西的。也许有一个指令寄存器,一个标志寄存器,一个寄存器,其中存储了目标寄存器号,一个寄存器用于立即值,以及某种使用地址的表示。
无论如何,对于RISC处理器,您可能听说过这个指令寄存器,即使因为通用寄存器的长度是64位,其他寄存器也不一定是这个大小。例如。 Streaming SIMD Extensions提供xmm寄存器,大小为128位。它们可以包含完整的15字节有效x86指令。