2017-11-18 19 views
1

私は、文字列の最初の文字を印刷することになっています。このコードを持っている:ヌル終端文字列を変更し

mov bx, message ; Move the address of the message to bx   
add bx, 0x7c00 ; Adding the padding of bootsector to bx 
mov al, [bx]  ; Move the value at the address in bx to al 
int 0x10   ; Interrupt drawing the character in al to screen 

しないのはなぜこの作品:

message: 
    db "Test", 0 

が、これは動作します:

message: 
    db "Test", 0, 0 

最初の文字はランダムな文字を表示し、2番目の文字は常に自分のメッセージの最初の文字を表示します。

コードはNASMで.binにコンパイルされ、Bochsのブートセクタとして実行されました。

** EDIT

フルコード:@Jesterが推測として

mov ah, 0x0e 

message: 
    db 'Booting MainOPS', 0 

printTheMessage: 
    mov bx, message 
    add bx, 0x7c00 
    mov al, [bx] 
    int 0x10 

jmp $ 

times 510 - ($-$$) db 0 

dw 0xaa55 
+3

これは[MCVE]ではありません。チャンスはあなたです。コードパスに文字列を配置します。私よりも多くの人がそれをやります。また、bochsデバッガを使用する方法も学びます。 – Jester

+0

@Jesterコード全体を追加しました。それは基本的に私の全体のコードだったので、違いはありません。はい何かが可能です私は専門家ではないので、おそらく何か愚かです。私はそれを使うことを学んでいます。 – Maineri

+2

btw、 'add bx、0x7c00'でオフセットを調整しなくてもいいように' [org 0x7c00] 'を使ってください(ただし、これはもっと一般的なBIOSでしか動作しません。 0000:7C00'のようなものですが、 '07C0:0000'のようなものなので、' cs'からコピーされた 'ds'は間違っています...ああ待って、' ds'をまったく設定しないでください。あなたはbochsがとても自然な環境であることを幸運なことです。常識的な値を持つブートローダをレジスタに起動します。* ROBUST *ブートローダを作成することは非常に難しいです。 – Ped7g

答えて

1

にです。 messageをそのままコードとして実行します。コードの実行はmov ah, 0x0eで始まり、それに続いて直接続くバイトで続きます。文字列は'Booting MainOPS', 0で、その後にはprintTheMessageコードが続きます。

messageを無限ループの後に移動するか、最初の命令の後にjmpprintTheMessageを追加します。

+0

ありがとう! – Maineri

関連する問題