**ブート プログラムと言うとき、OS を起動するプログラムを意味するわけではないことに注意してください。つまり、コンピューターを起動して何かを実行するときに実行される単純なプログラムです。
私は Assembly/NASM に精通しているわけではありませんが、簡単なブート プログラムを作成するのに十分な知識があると思います。
まあ、私は十分に把握していると思いました。どうやらそうではありません。
オンラインで見つけた簡単なブートプログラムを試しました。正常に実行されました (文字 'A' が出力されます)。次に、メモリに保存されている手紙を印刷するように変更しました。失敗しました。'A' を印刷する代わりに、スマイリー フェイスを印刷します。(誓って、コンピューターは今私を笑っています。)
これはソース ファイルのコードです。
[BITS 16] ; We start up in 16-bit real mode
[ORG 0x7C00] ; We're booted into memory at this address. (Or so I'm told)
mov ah, 0x0E ; Teletype command
mov bh, 0x00 ; Page number
mov bl, 0x07 ; Attributes (7 == white foreground, black background)
mov al, [testChar] ; Character to print; load it from the memory referenced by testChar.
int 0x10 ; Tell the BIOS to execute the teletype command.
jmp $ ; Infinite loop prevents us from going off and executing the other junk in memory
testChar db 65 ; This is the character we want to print. 'A'.
; The following code pads the rest of the outputted binary file
; and concludes it with the bootloader signature so I don't have
; to do so manually.
times 510-($-$$) db 0
dw 0xAA55
「 move al, [testChar]」を「move al, 65 」に置き換えると、文字「A」が正しく出力されます。メモリ宣言を動かしてみました。BITS と ORG を括弧で囲むか括弧なしですべての組み合わせを試しました。また、testChar のインクリメントとデクリメント (つまり [testChar+1]) も試しました。毎回、スマイリー、逆スマイリー (testChar をインクリメントしたとき)、または何も出力しません (おそらくコードが実行されていないため、コードの前にメモリ宣言を置いたとき =P)。私はいまいましいことを働かせることができません。
さて、仕様について(おそらく関連しているため):
Intel Pentium II プロセッサを搭載した Dell Latitude CPi を実行しています。これだけでテストする必要があるからです (通常のコンピュータでアセンブラをテストしているわけではありません。まったく違います)。Windows XP、Ubuntu、および Arch Linux を実行したので、プロセッサは x86 であると確信しています。
私は現在、NASM を使用して Arch Linux でプログラムを作成およびコンパイルしています。
ブート プログラムはフロッピー ディスクから実行されます。
「nasm -f bin FILENAME」を使用してコードをコンパイルします。
次に、AL の「mtools」パッケージの「mformat」コマンドを使用して、「mformat -f 1440 -B BOOTPROGRAM A:」を介してコンパイル済みのブート プログラムをフロッピー ディスクに転送します。
それで、今回は何を台無しにしたのですか?または、プロセッサ/BIOS に問題がありますか?