我无法完全掌握远/近版本的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"
我的假设是否正确?
答案 0 :(得分:2)
是的,远程跳转/呼叫当然会更新CS
。
在保护模式下,段选择器引用表中的条目,即GDT
(全局描述符表)或LDT
(本地描述符表),具体取决于位#2的值。所述描述符条目保存基本地址和段的限制。
这些都在英特尔手册中有详细描述。