1

このセグメントの意味:

MOV     SI,SP
PUSH    AX
POP     ES

ES はどのように 0000:7c00 (およびさらに DS) を取得しますか

このMBRモデルでは?

0000:7C00 FA            CLI                     disable int's
0000:7C01 33C0          XOR     AX,AX           set stack seg to 0000
0000:7C03 8ED0          MOV     SS,AX
0000:7C05 BC007C        MOV     SP,7C00         set stack ptr to 7c00
0000:7C08 8BF4          MOV     SI,SP           SI now 7c00
0000:7C0A 50            PUSH    AX
0000:7C0B 07            POP     ES              ES now 0000:7c00
0000:7C0C 50            PUSH    AX
0000:7C0D 1F            POP     DS              DS now 0000:7c00
0000:7C0E FB            STI                     allow int's
0000:7C0F FC            CLD                     clear direction
0000:7C10 BF0006        MOV     DI,0600         DI now 0600

特殊なケース (または文書化されていない手順) のようなものであることをリリースしました - 中断の前後に CLI / STI がブロックされます。

/upd ソースを追加: http://www.nondot.org/sabre/os/files/Booting/mbr.txt

4

2 に答える 2

1

ESES は 16 ビットであるため、それ自体では 0000:7c00 を指しません。これらのコメントが言うべきことはDS:SIES:SI両方とも 0000:7c00 を指しているということです。

これは、セグメント レジスタをプッシュ(その時点で 0 を含む) してからポップすることによりDS、 とが両方とも 0 に設定されるためです。には値 7c00 が与えられているため、 と 0000:7c00 を指しています(リアル モードでの絶対アドレスは です) 。ESAXSIDS:SIES:SIsegment * 0x10 + offset

于 2012-12-15T07:42:29.947 に答える
1

コードの私の解釈は次のとおりです。

0000:7C00 FA        CLI               disable int's
0000:7C01 33C0      XOR     AX,AX     AX = 0x0000
0000:7C03 8ED0      MOV     SS,AX     SS = 0x0000
0000:7C05 BC007C    MOV     SP,7C00   SS:SP = 0x0000:0x7C00
0000:7C08 8BF4      MOV     SI,SP     SI = 0x7C00
0000:7C0A 50        PUSH    AX
0000:7C0B 07        POP     ES        ES = 0x0000
0000:7C0C 50        PUSH    AX
0000:7C0D 1F        POP     DS        DS = 0x0000
0000:7C0E FB        STI               allow int's
0000:7C0F FC        CLD               clear direction
0000:7C10 BF0006    MOV     DI,0600   DI = 0x0600

                    MOV CX,0100       CX = 0x0100
                    REP MOVSW         Copy 256 words (512 bytes)
                                        from 0x0000:0x7C00 to
                                        0x0000:0x0600
                    JMP ??            Jump to relocated code

最後の 3 つの命令は私が作ったものです。しかし、これが実際の MBR の動作であることはほぼ保証できます。これは、MBR が通常、OS のブート セクタを 0x7C00 にロードし、それ自体を上書きできないため、最初に再配置する必要があるためです。

プッシュ/ポップの代わりにMOV ES,AXandを使用しなかった理由がわかりません。MOV DS,AXただし、両方のバージョンのコストは 2 バイトです (たとえば、 の 2 バイトと のMOV ES,AX1 バイトにPUSH AX加えて の 1 バイトPOP ES)。違いは関係ありません (使用するバイトが 512 バイトしかなく、そのうち 66 バイトを使用する必要がある場合、コード サイズが最も重要です)。最後にパーティションテーブルとマジックシグネチャ)。

于 2012-12-15T09:05:33.067 に答える