我无法完全掌握jmp/call的远/近版本的细节。据我所知,jmp/call指令使用指令本身的相对偏移量作为操作数。Far jmp/call指令使用绝对地址作为操作数。
1)在受保护模式下,这个绝对地址只是编译器放置的虚拟地址。
2)在实际模式中,您通常会写:
jmp [new number of code segment][proc name as offset]然后用公式计算绝对地址:
address = new number * 10h + offset这实际上是实模式下的物理地址。
例如,当代码跳转到加载的引导扇区代码时,执行远jmp/时,CPU会自动更新CS。我看不到在引导扇区文件的源代码中设置CS值。
在保护模式下:cs = index in descriptor table = absolute address / page size
实模式:cs = segment index in RAM = specified "new number of code segment"
我的假设正确吗?
发布于 2013-10-28 20:20:18
是的,跳远/呼叫当然会更新CS。
在受保护模式下,段选择器根据位#2的值,引用表中的一个条目,即GDT (全局描述符表)或LDT (本地描述符表)。所述描述符项持有该段的基本地址和限制。
这在英特尔手册中都有详细描述。
https://stackoverflow.com/questions/19640947
复制相似问题