2016-10-20 21 views
0

NASMを使用してQエミュレータで文字列を印刷しようとしています。私のコードは以下の通りである:私はこのコードをコンパイルするときアセンブリ言語で文字列を印刷する方法

mov bx,HELLO 
mov ah, 0x0e 
int 0x10 
HELLO: 
    db 'Hello', 0 
jmp $ 
times 510-($-$$) db 0 
dw 0xaa55 

はしかし、私が手出力は

UU 

は誰でもしてくださいTEL私をなぜそうなのかできているのですか?そして、出力として必要な文字列を取得する方法?

ありがとうございます。 ALRIGHT SOここ

+1

は、あなたがこれを組み立てる方法を示していないが、私を打つ一つのことは、あなたがでORGディレクティブを持っていないということですトップ。 'ORG 0x7c00'のように。可能であれば、_NASM_でアセンブルするときに '-f bin'を使用し、0x0000のデフォルトORGを使用しました。それはあなたの問題ではありませんが。 Int 10h/ah = 0ehは、一度に1文字ずつ出力し、_BX_のメモリアドレスを取らない –

+0

はい、これはテストプログラムです。私は実際にマクロを呼び出す方法を理解しようとしていますが、このコードを適切に実行することはできません。私はNASMでアセンブルするときに-f binを使用しています –

+0

'jmp $'の後ろにデータを置くべきです。それをJMPの前に置くと、プロセッサは命令として「HELLO」のデータをデコードし、予期せぬ動作につながる可能性があります。 –

答えて

0

は、文字列をロードするためには、あなたの質問

にthingamabobである、あなたはSI(本当に深くに行きたいが、ちょうどそれをしない)に移動しなければなりません。次に、文字をレジスタにロードするために、lodsbを使用します。次に、それを印刷する必要がありますので、int 10h mov ah、0Ehを使用してください。 Int 10hはビデオを処理し、ahはBIOSにal(aka lodsb)の内容を印刷するよう指示します。次に、エンディング・ローディング・キャラクタを持たなければならないので、永遠にループしません。私は個人的に私は0x00を使用しますが、0を使用します.0を使用するだけでなく、0x00は何も印刷しないので、なぜそれが必要なのでしょうか?

はALRIGHTので、我々はすべてが行われましたし、ここに行くのコードです:

 
    mov si, message  ;The message location *you can change this* 
    call print   ;CALL tells the pc to jump back here when done 

    print: 
     mov ah, 0Eh   ;Set function 

    .run: 
     lodsb    ;Get the char 
    ; cmp al, 0x00  ;I would use this but ya know u dont so use: 
     cmp al, 0   ;0 has a HEX code of 0x48 so its not 0x00 
     je .done   ;Jump to done if ending code is found 
     int 10h    ;Else print 
     jmp .run   ; and jump back to .run 

    .done: 
     ret     ;Return 

    message   db 'Hello, world', 0 ;IF you use 0x00 
    ;message   db 'Hello, world', 0x00 

関連する問題