CPU如何区分
CALL rel16
(E8 CW)和CALL rel32
(E8 cd)?
根据此站点,镜像英特尔架构手册,
CALL rel16
和CALL rel32
的操作码分别是E8 cw
和E8 cd
。
这让我想知道,CPU如何区分这些操作码,因为
E8 cw
可能是E8 cw
的前缀?
前缀
66
用于在 16 位和 32 位操作数大小之间切换。因此,在 16 位操作模式下,E8 cw
为 CALL rel16
,66 E8 cd
为 CALL rel32
,而在 32 位操作模式下,E8 cd
为 CALL rel32
,66 E8 cw
为 CALL rel16
。
在长模式(64 位模式)下,根据 Intel 手册,
CALL rel16
似乎不可用。 CALL rel32
的工作方式与 32 位模式类似,但 rel32
立即数被符号扩展为 64 位并添加到 rip
而不是 eip
。