繁体   English   中英

x86 汇编 16 位相对调用

[英]x86 Assembly 16-bit Relative Call

我注意到以下两个汇编指令在 x86 中可用:

E8 cw    CALL rel16
E8 cd    CALL rel32

我很困惑指令处理器如何区分这两个调用。 我唯一能想到的是,如果应用程序是 16 位的,IP 会采用前者,如果应用程序是 32 位的,IP 会采用后者。 我的解释是否正确,或者有没有办法将CALL rel16编码为 32 位应用程序?

这个答案由迈克尔佩奇在问题的评论中提供:

操作数大小(决定是rel16还是rel32)根据处理器的模式(实模式/32位保护模式/16位保护模式/64位长模式/V8086模式等)有不同的默认大小. 您可以查看此图表了解详细信息 您可以使用 0x66 操作数前缀覆盖默认值。 在 32 位模式下,您可以使用 0x66 指令前缀将默认操作数大小从 32 位更改为 16 位。

我注意到使用此指令时,EIP 的高 16 位被清零。 因此, 0x66 0xE8 16 位相对调用具有以下 C++ 语义:

int16_t offset = ...;
EIP = (EIP + offset) & 0xFFFF;

所以是的,可以在 32 位应用程序中使用 16 位相对调用指令。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM