BIOSのブートストラップシーケンスは、最初に検出した有効なMBRをアドレス0x7C00のコンピューターの物理メモリにロードします。
起動プロセスのSPに使用する値はどれですか?
org 7c00h ; set location counter.
mov ax, XXX ; What is XXX?
mov sp, ax
; Now PUSH an POP are safe
BIOSのブートストラップシーケンスは、最初に検出した有効なMBRをアドレス0x7C00のコンピューターの物理メモリにロードします。
起動プロセスのSPに使用する値はどれですか?
org 7c00h ; set location counter.
mov ax, XXX ; What is XXX?
mov sp, ax
; Now PUSH an POP are safe
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であることを確認してください。
SS:SP
コードと割り込みサービスルーチンに十分なスタックスペースがあるような値であれば、問題ありません。
もちろん、スタックがコードやその他のデータと衝突したり、ROMやメモリマップされたデバイスのアドレス範囲にぶつかったりしないようにする必要があります。
SS:SP
BIOSは、ブートセクタが受け取るものを保証しません。ですから、変更するだけSP
では正しくありません。
たとえば、これを行うことができます(この場所にあなたのコードまたはデータがない場合):
...
mov ax, 0
mov ss, ax
mov sp, ax
...
これはSS:SP
0:0に設定されます。まだ慌てる必要はありません。次のプッシュは、最初SP
に0から0xFFFEにデクリメントし、0:0ではなく0:0xFFFEに書き込みます。
これにより、0x10000-(0x7c00 + 0x200)=ブートセクターの終わりと最大スタックポインターアドレスの間に33280バイトのスペースが与えられます。それは十分なスタックスペースです。
SS
また、との両方を変更する場合SP
は、割り込みを無効にして変更するか、最初SS
に変更してから直後の命令で変更する必要があることに注意してSP
ください(上記のように)。
または、この命令を使用することもできますがLSS SP, ...
、引数としてfarアドレスのアドレスを取ります。つまり、新しいSS:SP
値は最初にメモリ内のどこかにある必要があります。
変更するさらに別の方法は、SS
とSP
を使用することです。PUSH
RETF