7

FWORD 数据类型定义为 6 个字节,那么它是如何在 jmp 指令中转换为 32 位虚拟地址的:

    jmp FWORD PTR [eax-0x67]

?...

4

2 回答 2

8

当您跳转到 FWORD PTR 时,您所做的是“远跳转”——也就是说,指向的内存包含一个 16 位“选择器”(指 GDT 或 LDT 中的段条目),以及从选择器引用的段开头的 32 位偏移量。段描述符包含关于段的数据,当然……包括它在内存中的起始位置。

在跳转期间,CPU 会进行一些特权检查以确保选择器有效且被允许(涉及特权级别和段类型等),然后它将前 16 位有效地加载到 CS 中,其余的加载到 EIP 中。从那时起,代码地址有效地将 CS 段的基地址添加到它们中,从而将它们变成虚拟地​​址。

于 2012-09-14T21:17:49.570 回答
4

远跳转使用完整的段基:偏移值作为绝对地址,因此它由 16 位段和 32 位地址组成。它执行跳转到位于与当前代码段不同的段中的指令,但它应该处于相同的特权级别。

于 2012-09-14T21:22:46.577 回答