假设我们有近乎相对的调用x86指令。
E8 offset // offset from the next instruction
偏移的大小由当前操作数大小决定。
在32位保护模式下:
E8 rel32 // target 32bit address = add_32bit(eip, rel32)
66 E8 rel16 // target 32bit address = zero_extend_32bit(add_16bit(ip, rel16))
在64位模式下:
E8 rel32 // target 64bit address = add_64bit(rip, sign_extend_64bit(rel32))
66 E8 rel16 // target 64bit address = zero_extend_64bit(add_16bit(ip, rel16))
在实模式下:
E8 rel16 // target 16bit address = add_16bit(ip, rel16)
我不明白如果我们在实模式下有32位位移会发生什么?一种可能的方式:
66 E8 rel32 // target 16bit address = truncate_16bit(add_32bit(eip, rel32))
因此在这种情况下,ip将加载目标16位地址。但另一种可能的情况是eip将加载目标32位地址,如果它是>将生成0xFFFF保护错误。
那么66 E8 rel32
在实模式下会发生什么?感谢。