-1

BIOS割り込みを使用して、OS /カーネルリアルモード環境でハードコードされたテキスト文字列を出力することにより、Intelx86Nasmのベースライン知識を高めようとしています。

これが私のコードです:

top:
[BITS 16]
[ORG 7C00h]
resb 56 ; Just for testing
outStr db "This is a test string!", 10, 0
resb 56

.main:
main:
mov edi, outStr
again:
mov BYTE al, [edi]
mov ah,0Eh
int 10h
inc edi

cmp BYTE [edi], 0
jg again


leaving:
mov ah, 0Eh

mov al,13
int 10h
mov al,10
int 10h

mov al,'Q' ; Using the distinct character Q to show that the code executed to this point
int 10h

complete:
hlt


times (510-($-top)) db 0 ; Pad the executable to act as the boot sector
dw 0xAA55

私は実際にそれを動作させましたが、特定の文字列でのみです。の内容を変更するoutStrと、コードがまったく実行されない場合があります。最初は長さだと思いましたが、これが決め手ではないことがわかりました。少数のランダムな文字、たとえば「Gfd」は正常に出力されますが、「Gfdは素晴らしいです!」不思議なことに動作しません。一方、「ABCDEFGH ... Z」(完全大文字のアルファベット)は機能しました。物事をさらに奇妙にするために、完全な小文字のアルファベットは機能しませんでした。

それが機能しないときはいつでも、最後の確認文字( "Q")は出力されず、他の予想される動作は観察されません。これは、実行可能コードとは関係がないが、他の何か。

重要: QEMUを使用してテストを行っています。これはかなり一般的に使用されているツールのようで、(上記の例外を除いて)私には機能しますが、これが出力に何らかの影響を与える可能性があるかどうかを確認したいと思います。

4

2 に答える 2

4

あなたは明らかにあなたの文字列を実行しています。最初にメインにジャンプするか、コードの後に​​データを宣言します。

于 2012-07-06T17:21:48.780 に答える
4

あなたはあなたのresbと文字列を実行しています!'emを超える"jmp"。

ds...およびおそらくes...を初期化し、既知の(安全な!)アドレスに有効なスタックを設定します。QEMUが許容可能な値で起動している可能性がありますが、それを当てにするべきではありません。0x7C00でロードされており、ブートドライブ番号がdlであると仮定します。

「hlt」は、割り込みが発生するまで(特に、タイマー割り込みの場合は18.2秒に1回)、CPUを停止します。その時点で、ランダムなコードを実行します。CPUをクールに保ちたい場合は、「hlt」を無限ループに入れてください...

ハッピーブートイン、

フランク

于 2012-07-06T17:28:38.470 に答える