CPU如何区分'CALL rel16'(E8 cw)和'CALL rel32'(E8 cd)?

Shu*_*eng 10 x86 assembly isa

CPU如何区分CALL rel16(E8 cw)和CALL rel32(E8 cd)?

根据这个网站,镜像英特尔架构手册,为操作码CALL rel16CALL rel32E8 cwE8 cd分别.

这让我很奇怪,CPU如何区分这些操作码,因为它E8 cw可能是一个前缀E8 cw

fuz*_*fuz 11

前缀66用于在16位和32位操作数大小之间切换.因此,在16个的操作模式,E8 cwCALL rel1666 E8 cdCALL rel32,而在32位操作模式中,E8 cdCALL rel3266 E8 cwCALL rel16.

在长模式(64位模式)下,CALL rel16根据英特尔手册似乎无法使用.CALL rel32在32位模式下工作,但rel32立即符号扩展到64位并添加到rip而不是eip.

  • @Shuzheng 前缀“66”适用于 16 位和 32 位可用的所有指令,并且在所有指令中的工作方式相同。因此,无需在每条指令的文档中一遍又一遍地解释这一点。 (3认同)