0

gdbを使用してxv6(教育用OS)での起動を理解しようとしています。

初期ブート中の命令の 1 つ (AT&T 構文) は次のとおりです。

cmpl 0x0,%cs:0x65a4

その後、

jne 0xfd2b9

今、私が理解していることから、cmpl は 2 つの値を比較してフラグを設定し、jne はフラグを見て、比較したばかりの値が等しくない場合はジャンプします。

しかし、オペランドとしての %cs:0x65a4 の意味がわかりません。これはアドレスの値 (cs*16 + 65a4) を参照していますか、それともそのメモリ位置の実際の内容を参照していますか?

システムが jne 命令の後にジャンプしないためです。つまり、2 番目のオペランド (%cs:0x65a4) がゼロに評価されます。しかし、アドレスもその内容もゼロではないため、そうすべきではありません。

4

1 に答える 1

0

これはアドレスの値 (cs*16 + 65a4) を参照していますか、それともそのメモリ位置の実際の内容を参照していますか?

アドレス (cs*0x10 + 0x65a4) にあるメモリ内の 32 ビット ワードは、CPU が「リアル モード」で実行されていると仮定して、値 0 と比較されます。

しかし、何かが私には非常に奇妙に思えます:

「リアルモード」のアドレス計算である「cs*0x10」の話ですね。80286 以降、「保護モード」と呼ばれる 2 番目のアドレス指定モードがあります。このモードでは、単純に絶対アドレスを計算することはできません...

CPU は、プロテクト モードで実行されている場合にのみ「32 ビット モード」になります。x86 CPU の 16 ビットと 32 ビットの命令セットは異なります。

また、「jne 0xfd2b9」は間違いなく 32 ビット命令であり、EIP は間違いなく 32 ビット レジスタです。

だからどちらか...

  • ... CPU はリアル モードで実行されますが、逆アセンブルされたコードは 32 ビット コードです (逆アセンブルが間違っています)。
  • ... CPU はリアル モードで実行されますが、32 ビット コードをアセンブルしました (コードが間違っています)。
  • ... CPU はプロテクト モードで実行されるため、cs*0x10 の計算は間違っています
于 2015-01-27T16:17:08.963 に答える