「アドレス0x500はBIOSによって使用される最後のアドレスです」はウィキペディアのものです -
「00000000-000003FFリアルモードIVT(割り込みベクトルテーブル)」は、BIOSメモリマップに関するosdev.orgの記事に記載されています。
では、NASMが.comファイルのスタックポインタを0x3FFに配置し、命令ポインタが0x7C00で始まる理由を教えてください。私にとって、SPの最も直感的な場所は、0x7C00のすぐ下です。
「アドレス0x500はBIOSによって使用される最後のアドレスです」はウィキペディアのものです -
「00000000-000003FFリアルモードIVT(割り込みベクトルテーブル)」は、BIOSメモリマップに関するosdev.orgの記事に記載されています。
では、NASMが.comファイルのスタックポインタを0x3FFに配置し、命令ポインタが0x7C00で始まる理由を教えてください。私にとって、SPの最も直感的な場所は、0x7C00のすぐ下です。
簡単な答えは、ブートセクターには、BIOSによって使用された有効な(そしておそらく小さい)スタックがあるということです。
嬉しい答えは、3FFhが一部のBIOSの有効なスタック位置であるということです。この場合、それがIVTの下部であるという事実は、これらの割り込みベクトルがBIOSによって使用されていないためです。それは秘密ではありません。
BIOSスタック領域
BIOSは、スタック領域として30:0000h〜30:00FFh(割り込みベクタテーブルの上)を使用します。この領域は、BIOS計算と一時ストレージに使用されます。AMIBIOSでサポートされていないINTC0hからFFhのアドレスは、通常、このスペースを占有します。AMIBIOS 1993のプログラマーガイド、181ページ
BIOSが有効なスタックを維持することは期待されていないと思います。したがって、空きメモリにスタックを自分で設定する必要があります。ブートローダーでの私の一般的な起動シーケンスは次のとおりです。
[BITS 16]
[ORG 0x7C00]
xor ax,ax ;AX=0
mov ds,ax
mov es,ax ;can be omitted
mov ss,ax
mov sp,0x7000 ;or replace with some other nice valid piece of memory
jmp word 0:begin ;BIOSes are sometimes buggy and load you initially with CS=7C0
begin:
;....
NASMはあなたが言うこと以外は何もしません。これがアセンブリを使用するポイントです。アセンブリコードのすべての行には、コンピューターによって実行されるオペコードの比率が1:1です。したがって、BIOSがスタックをセットアップせず、アセンブリコードのどこにもスタックをセットアップしない場合、スタックは無効な状態になります。Nasmは、スタックをセットアップするためのマジックコードを挿入しません。
NASMについてはよくわかりませんが、スタックセグメントレジスタ(SS)が0以外に設定されていると確信しているため、SS:SPはまったく異なる場所を指します。
編集:待ってください、あなたのセグメントまたはポインターは03FFに設定されていますか?
レジスタの内容を変更するのはアセンブラではありません(実行可能ファイル内の非表示のコマンド、この場合はブートリーダーによって)。
Intelのマニュアルによると、SPにこのような奇妙な値が含まれるのはCPUでもありません。 http://www.intel.com/design/pentiumii/manuals/243192.htm
コードが実行される既存のOSがないため、SP(およびその他のレジスタ)の状態を引き起こすために残された唯一のオプションはBIOSです。残念ながら、BIOSはクローズドソースの「企業秘密」であるため、「なぜ」という質問には答えたままになります。http://www.coreboot.org/Welcome_to_corebootのCorebootは、物事がそのようになっている理由についていくつかのヒントを与えるかもしれませんが、Corebootは従来のBIOSとは非常に異なることをすることがあります...