2017-03-04 16 views
2

アセンブリが初めてです。 BIOSの機能を把握しようとしているうちに、私はgdbを使ってそれをトレースします。しかし、私は本当に奇妙なものを見つけました。
コードセグメントは、このです:BIOSは異なるポートから同じ行の同じレジスタに2回読み込みます

[f000:d129] 0xfd129: mov eax,0x8f 
[f000:d12f] 0xfd12f: out 0x70,al 
[f000:d131] 0xfd131: in  al,0x71 
[f000:d133] 0xfd133: in  al,0x92 
[f000:d135] 0xfd135: or  al,0x2 
[f000:d137] 0xfd137: out 0x92,al 

BIOSポート(0x71)を、行に0x92から読み出しなぜだろう。 2番目の命令はポート0x71から読み取った値をカバーしますか?では、なぜポート0x71から読み取るのですか?

ありがとうございました!

答えて

4

IOポート0x70は「CMOS/RTCインデックスレジスタ」で、IOポート0x71は「CMOS/RTCデータレジスタ」です。 CMOSで何かにアクセスするには、インデックスを設定してからデータレジスタを読み書きします。

一部のRTCチップでは、インデックスを設定し、データレジスタを読み書きしないと、チップは未定義の状態のままです。つまり、後でインデックスを設定する場合は、データレジスタから読み取って、「未定義状態」を避ける必要があります。

つまり、読まれた価値は関係ありません。読書は副作用を引き起こし、それは重要な副作用です。

+0

ポート0x70は、NMIを無効/有効にするためにも使用されます。ビット7が0の場合、NMIが有効になり、ビット7が1の場合、NMIは無効になります。したがって、コードはNMIを無効にして、あなたが与えた理由でポート0x71のダミーリードを実行しています。 –

+0

@RossRidge:恐ろしい "致命的なハードウェアの失敗を無視して、勇敢に前向きに認識できない"可能性を最後に忘れるまでには数年かかりました。私は今悲しいです。 ;-) – Brendan

+0

ああ、マスキング不可能な割り込みをマスクするアイデアは単なる悪です。私たちは本当にこれを再び起こすべきではありません。一口... –

2

ポート0x70および0x71は、CMOS registersです。

このトピックのベストリストは、is from the BOCHS emulatorです。次のように
このリストによれば、コード読み取り:

mov eax,0x8f ; sets 'NMI disabled ' and 'CMOS RAM index' = 64 
out 0x70,al ; write 
in  al,0x71 ; any write to 0x70 should be followed by an action to 0x71 or the RTC wil be left in an unknown state. 
in  al,0x92 ; read PS/2 system control port A 
or  al,0x2  ; set BIT1 = indicates A20 active 
out 0x92,al ; write PS/2 system control port A 

ので、このコードは、NMIを無効にし、アクティブ状態にA20 lineを設定します。最後の3行はFast A20 Gateを実装しています。 BIOSは(in al,0x71に読んで)理由は、単にだから

any write to 0070 should be followed by an action to 0071 or the RTC will be left in an unknown state. 

最初の読み取りである

をポート(0x71)をから読み込んで、行の0x92なぜかしら


これを保証する以外の目的を果たしておらず、その結果は無視することができます。

関連する問題