【问题标题】:near/far jmp/call specifics近/远 jmp/呼叫细节
【发布时间】:2013-11-07 14:07:18
【问题描述】:

我无法完全掌握 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"

我的假设是否正确?

【问题讨论】:

    标签: assembly x86 real-mode memory-segmentation


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-26
      • 2013-12-27
      • 2013-05-09
      • 1970-01-01
      • 1970-01-01
      • 2019-07-14
      • 1970-01-01
      • 2012-06-30
      相关资源
      最近更新 更多