FWORD 数据类型定义为 6 个字节,那么它是如何在 jmp 指令中转换为 32 位虚拟地址的:
jmp FWORD PTR [eax-0x67]
?...
当您跳转到 FWORD PTR 时,您所做的是“远跳转”——也就是说,指向的内存包含一个 16 位“选择器”(指 GDT 或 LDT 中的段条目),以及从选择器引用的段开头的 32 位偏移量。段描述符包含关于段的数据,当然……包括它在内存中的起始位置。
在跳转期间,CPU 会进行一些特权检查以确保选择器有效且被允许(涉及特权级别和段类型等),然后它将前 16 位有效地加载到 CS 中,其余的加载到 EIP 中。从那时起,代码地址有效地将 CS 段的基地址添加到它们中,从而将它们变成虚拟地址。
远跳转使用完整的段基:偏移值作为绝对地址,因此它由 16 位段和 32 位地址组成。它执行跳转到位于与当前代码段不同的段中的指令,但它应该处于相同的特权级别。