near / far jmp / call specifics

时间:2013-10-28 17:11:08

标签: assembly x86 real-mode memory-segmentation

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

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"

我的假设是否正确?

1 个答案:

答案 0 :(得分:2)

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

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

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