4

**ブート プログラムと言うとき、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 に問題がありますか?

4

3 に答える 3

3

DS はおそらくガベージ値で満たされている可能性があるため、次のようにします。

push cs
pop ds

また

mov ax, cs
mov ds, ax
mov es, ax

さらに良いことに、CS を信用せずに次のことを行ってください。

xor ax, ax
mov ds, ax

このディスカッションを参照してください: 一部の BIOS は、特に ElTorito を使用して CD-ROM から起動する場合に、従来の 0000:7c00 の代わりに 07c0:0000 を使用する場合があります。

于 2011-07-11T06:45:51.823 に答える
0

最初に実行したときはうまくいきました!'A' が印刷されます。コマンド nasm [filename.asm] -o [filename.com] -l [filename.lst] を使用します。

nasm OSbad.asm -o OSbad.com を使用しました。MagicISO を使用して起動可能なイメージ ファイル OSbad.iso を作成し、Windows ディスク バーナーを使用して DVD/RW に書き込みました。Oracle VM をロードし、256 Mb の RAM、CD/DVD、2 GB のハードディスクを備えた新しい仮想マシンを作成しました。DVDで起動すると、画面に「A」が表示されます。

だから私はあなたのプログラムが働いていると思います。それを機能させないのは、あなたがしている他のことであるに違いありません。

于 2013-06-27T09:38:04.127 に答える
0

これにより、次のコードが生成されます (コンパイルされたコードで objdump を実行するだけです)。

00000000  B40E              mov ah,0xe
00000002  B700              mov bh,0x0
00000004  B307              mov bl,0x7
00000006  A00D7C            mov al,[0x7c0d]
00000009  CD10              int 0x10
0000000B  EBFE              jmp short 0xb
0000000D  41                inc cx ; this is actually your testChar
                                   ; ignore the opcode translation

0x7C00 にいる場合、[0x7c0d] がその最後のバイトになります (つまり、0x41 または 65、または ASCII "A")。しかし、他の貢献者の 1 人 (ninjalj) のように、0x7C00 に位置していないことを意味する奇妙な BIOS バグがあると述べた場合、[0x7c0d] は誰の推測でもあります。

于 2011-07-12T14:57:53.190 に答える