3

BIOSのブートストラップシーケンスは、最初に検出した有効なMBRをアドレス0x7C00のコンピューターの物理メモリにロードします。

起動プロセスのSPに使用する値はどれですか?

org 7c00h      ; set location counter.
mov ax, XXX    ; What is XXX?
mov sp, ax
; Now PUSH an POP are safe
4

2 に答える 2

4

0000:0500から0007:FFFFは無料で使用できることが保証されています。適切な初期化は次のようになります。

org 0x0600
...

cli
xor ax, ax
mov ds, ax
mov es, ax
mov ss, ax
mov sp, 0x7C00

; relocate itself
mov si, sp
mov di, 0x0600
mov cx, 256
rep movsw

; make sure we'are at 0000:0600+x
jmp 0:.reloc
.reloc:
push 2
popf    ; flags with all off

私は7C00を使用し、スタックは下向きになり、コードは上向きになります。7C00は、前述のように任意の有効な範囲に置き換えることができます。独自のコード/データを上書きしないように注意してください。

ところで、ほとんどのMBRは、従来は0000:0600に再配置し、VBRを7C00にチェーンロードしていました。

また、jmp .relocに注意してください。バグのあるBIOSは07C0:0000でMBRを開始するため、そこにあるjmpはCS=0であることを確認してください。

于 2012-05-16T00:51:09.173 に答える
3

SS:SPコードと割り込みサービスルーチンに十分なスタックスペースがあるようなであれば、問題ありません。

もちろん、スタックがコードやその他のデータと衝突したり、ROMやメモリマップされたデバイスのアドレス範囲にぶつかったりしないようにする必要があります。

SS:SPBIOSは、ブートセクタが受け取るものを保証しません。ですから、変更するだけSPでは正しくありません。

たとえば、これを行うことができます(この場所にあなたのコードまたはデータがない場合):

...
mov ax, 0
mov ss, ax
mov sp, ax
...

これはSS:SP0:0に設定されます。まだ慌てる必要はありません。次のプッシュは、最初SPに0から0xFFFEにデクリメントし、0:0ではなく0:0xFFFEに書き込みます。

これにより、0x10000-(0x7c00 + 0x200)=ブートセクターの終わりと最大スタックポインターアドレスの間に33280バイトのスペースが与えられます。それは十分なスタックスペースです。

SSまた、との両方を変更する場合SPは、割り込みを無効にして変更するか、最初SSに変更してから直後の命令で変更する必要があることに注意してSPください(上記のように)。

または、この命令を使用することもできますがLSS SP, ...、引数としてfarアドレスのアドレスを取ります。つまり、新しいSS:SP値は最初にメモリ内のどこかにある必要があります。

変更するさらに別の方法は、SSSPを使用することです。PUSHRETF

于 2012-05-15T14:29:42.327 に答える