我读到x86 CPU的可变指令长度为1到15个字节 . 另一方面,还写出x86字长为32位,这意味着所有寄存器,包括保存实际指令的指令寄存器,都是32位宽(4字节) .
这意味着指令可以比指令寄存器更宽 . 这怎么样?此外,我了解到在执行指令后,不跳转,指令计数器增加4.这意味着它假设每条指令长4个字节 . 这怎么样?
我希望有人可以为我澄清这一点 .
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,最后可以是立即偏移和/或立即值 .
REP
LOCK
push xxx
es
cs
ss
ds
我不知道,处理器如何实际存储这些东西 . 也许存在指令寄存器,标志寄存器,寄存器,存储目标寄存器号,寄存器用于立即值和某种使用地址的表示 .
无论如何,没有这个指令寄存器,你可能听说过RISC处理器,即使因为通用寄存器的长度是64位,其他寄存器也不一定是这个大小 . 例如 . Streaming SIMD Extensions提供xmm寄存器,大小为128位 . 它们可以包含完整的15字节有效x86指令 .
你可以找到the structure of this parser on page 5 here .
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指令 .
你可以找到the structure of this parser on page 5 here .