は、文字列をロードするためには、あなたの質問
に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
は、あなたがこれを組み立てる方法を示していないが、私を打つ一つのことは、あなたがでORGディレクティブを持っていないということですトップ。 'ORG 0x7c00'のように。可能であれば、_NASM_でアセンブルするときに '-f bin'を使用し、0x0000のデフォルトORGを使用しました。それはあなたの問題ではありませんが。 Int 10h/ah = 0ehは、一度に1文字ずつ出力し、_BX_のメモリアドレスを取らない –
はい、これはテストプログラムです。私は実際にマクロを呼び出す方法を理解しようとしていますが、このコードを適切に実行することはできません。私はNASMでアセンブルするときに-f binを使用しています –
'jmp $'の後ろにデータを置くべきです。それをJMPの前に置くと、プロセッサは命令として「HELLO」のデータをデコードし、予期せぬ動作につながる可能性があります。 –