0

我正在尝试使用 gdb 了解在 xv6(教学操作系统)中的引导。

初始引导期间的指令之一是(AT&T 语法):

cmpl 0x0,%cs:0x65a4

接着,

jne 0xfd2b9

现在,据我了解,cmpl 比较两个值并设置标志,如果刚刚比较的值不相等,jne 会查看标志并跳转。

但我不明白 %cs:0x65a4 作为操作数的含义。这是指地址的值 (cs*16 + 65a4),还是该内存位置的实际内容?

我问是因为系统最终不会在 jne 指令之后跳转,这意味着第二个操作数 (%cs:0x65a4) 评估为零。但这不应该是,因为地址和它的内容都不是零。

4

1 回答 1

0

这是指地址的值 (cs*16 + 65a4),还是该内存位置的实际内容?

内存中位于地址 (cs*0x10 + 0x65a4) 的 32 位字与值 0 进行比较 - 假设 CPU 在“实模式”下运行。

然而,有些事情对我来说似乎很奇怪:

您谈论的是“cs * 0x10”,这是“实模式”的地址计算。由于 80286 有第二种寻址模式,称为“保护模式”。在这种模式下,不能简单地计算绝对地址...

CPU 只能在保护模式下运行时处于“32 位模式”。x86 CPU 的 16 位和 32 位指令集是不同的!

而“jne 0xfd2b9”肯定是32位指令,EIP肯定是32位寄存器。

所以要么...

  • ... CPU在实模式下运行但你看到的反汇编代码是32位代码(所以反汇编是错误的)
  • ... CPU 在实模式下运行,但您组装了 32 位代码(因此代码错误)
  • ... CPU 在保护模式下运行,因此计算 cs*0x10 是错误的
于 2015-01-27T16:17:08.963 回答