1

我无法完全掌握 jmp/call 远/近版本的细节。据我了解, jmp/call 指令附近使用指令本身的相对偏移量作为操作数。Far jmp/call 指令使用绝对地址作为操作数。

1)在保护模式下,这个绝对地址只是编译器放置的虚拟地址。
2)在实模式下,您通常会写:

jmp [new number of code segment][proc name as offset]

然后绝对地址由公式计算:

address = new number * 10h + offset

这实际上是实模式下的物理地址。

执行 far jmp/call 时 CPU 会自动更新 CS 吗?例如,当 BIOS 代码跳转到加载的引导扇区代码时。我没有在引导扇区文件的源代码中看到设置 CS 值。

在保护模式下:cs = index in descriptor table = absolute address / page size
在实模式下:cs = segment index in RAM = specified "new number of code segment"

我的假设正确吗?

4

1 回答 1

3

是的,当然是远跳/呼叫更新CS

在保护模式下,段选择器引用表中的一个条目,即GDT(全局描述符表)或LDT(本地描述符表)取决于位#2 的值。所述描述符条目保存段的基地址和限制。

这在英特尔手册中有详细描述。

于 2013-10-28T20:20:18.557 回答