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

13
CPU如何区分CALL rel16(E8 cw)和CALL rel32(E8 cd)?
根据this site所述,参照英特尔架构手册,CALL rel16CALL rel32的操作码分别为E8 cwE8 cd
这让我想知道,CPU如何区分这些操作码,因为E8 cw可能是E8 cw的前缀?

我猜“这个网站”应该是一个超链接吧? - Cody Gray
请翻译下面关于编程的内容,将翻译后的文本返回:这个网站可能会在此处:https://c9x.me/x86/html/file_module_x86_id_26.html。 - Tommylee2k
抱歉,@Tommylee2k - 我已经插入了链接。 - Shuzheng
1个回答

13

前缀66用于在16位和32位操作数大小之间切换。因此,在16位操作模式下,E8 cw表示CALL rel1666 E8 cd表示CALL rel32;而在32位操作模式下,E8 cd表示CALL rel3266 E8 cw表示CALL rel16

在长模式(64位模式)中,根据英特尔手册,CALL rel16似乎不可用。 CALL rel32的作用类似于32位模式,但是rel32立即值被符号扩展到64位并添加到rip而不是eip


谢谢!不过,我认为很奇怪为什么英特尔手册没有提到这个前缀(请参见我链接的网站)。 - Shuzheng
手册确实如此,@Shuzheng。在“近调用”下面,它说:“操作数大小属性确定目标操作数的大小(16位或32位)。” - Cody Gray
3
@Shuzheng 前缀 66 适用于所有可在16位和32位中使用的指令,并且在所有指令中都以相同的方式工作。因此,在每个指令的文档中反复解释这一点是没有必要的。 - fuz
@CodyGray - 我认为他们是指参数是否给定为16位或32位操作数。 - Shuzheng
1
@Shuzheng 操作数大小属性由当前操作模式和操作数大小覆盖前缀(66)的存在确定。 - fuz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接