[英]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.