CPU中的直接数操作数如何工作?

Rab*_*s22 1 x86 assembly risc

举个例子:x86_64 CPU读取128位指令.

据我所知,这只是x86处理器中发生的事情.否则,不可能例如将64位数字添加到64位寄存器(对于数字> 64,操作码将占用几位+ 64位).

我想知道的是指令中的位数限制以及如果指令大于位数(数据总线)则如何读取指令.此外,我也知道大多数RISC CPU都使用固定大小的指令,所以如果你直接传递一个数字操作数,那么指令的大小是否会加倍?

har*_*old 6

读取128位指令的x86_64 CPU

这不会发生,最大指令大小定义为15个字节.您可以构建更长的指令,但它们将无效.

您不需要16个字节来获得一个采用64位立即数操作数的指令.只有一些x64指令甚至可以在第一时间执行此操作,例如mov r64, imm64,它被编码为REX.W B8+r io10个字节.几乎所有64位x64指令立即采用符号扩展的更短的立即数,8位或32位.

在RISC ISA中,通常不可能立即像字大小一样大,你必须分两步在寄存器中构造大值或从内存加载它们.但x64,就像它的x86根源一样,绝对不是RISC.

我怀疑这个问题(部分)是由一个接一个地通过数据总线的指令的心理形象所激发的,这对于MIPS等很好,但是对于可变长度的指令没有像x86中那样的对齐要求你可以要做到这一点 - 不管你选择什么样的区块,它可能(并且很可能)通过一些指令切入.因此,在最简单的视图中,解码是具有缓冲区的状态机,解码第一条指令并将其从缓冲区中删除,在有空间时填充更多字节(当然现在它更复杂).