2017-02-16 6 views
2

私は単純なhelloworldブートローダプログラムを習得しようとしています。このlinkを参照してください。私は正常にnasmアセンブラを使用してこのアセンブリコードのバイナリファイルを生成し、エミュレータbochsで実行し、正常に動作します。 しかし、ハードディスクで直接同じことをしたときに、文字列をスクリーンに印刷することができません。helloworldを印刷するための基本的なブートローダプログラムが動作していません

私が使用したコードは以下のとおりです。

[BITS 16] 
[ORG 0x7C00] 

MOV SI, HelloString 
CALL PrintString 
JMP $ 

PrintCharacter: 
    MOV AH, 0x0E 
    MOV BH, 0x00 
    MOV BL, 0x07 
    INT 0x10 
    RET 

PrintString: 
next_character: 
    MOV AL, [SI] 
    INC SI 
    CALL PrintCharacter 
    OR AL, AL 
    JZ exit_function 
    JMP next_character 
exit_function: 
    RET 

HelloString db "Pell",0 

TIMES 510 - ($ - $$) db 0 
DW 0xAA55 
+4

いつものように、あなたは 'DS'を初期化するのを忘れました。 – Jester

+0

あなたはこのDSが何をしているのか説明してください。私は初心者です。 – skesh

+1

別のSOの回答で[ブートローダのヒント](http://stackoverflow.com/a/32705076/3857942)があります。 _DS_のようなセグメントレジスタを設定する必要があります。あなたがハードドライブを言うと、実際のハードウェアで起動することを意味しますか? –

答えて

0

他の処理を行う前にセグメントレジスタを初期化する必要があります。そうしないと、データにアクセスできないプログラムがクラッシュします。

[BITS 16] 
[ORG 0x7C00] 

XOR AX, AX 
MOV DS, AX 

MOV SI, HelloString 
CALL PrintString 
JMP $ 

PrintCharacter: 
    MOV AH, 0x0E 
    MOV BH, 0x00 
    MOV BL, 0x07 
    INT 0x10 
    RET 

PrintString: 
next_character: 
    MOV AL, [SI] 
    INC SI 
    CALL PrintCharacter 
    OR AL, AL 
    JZ exit_function 
    JMP next_character 
exit_function: 
    RET 

HelloString db "Pell",0 

TIMES 510 - ($ - $$) db 0 
DW 0xAA55 
関連する問題