1
文字列の最後に指示0xa
を使用して、改行を作成して、最後に印刷された文字列が次の行に実行されないようにします。x86アーキテクチャ用のnasmを使用して改行が正しく実行されない
mov bx, MESSAGE
call print_string
mov bx, ANOTHER
call print_string
hlt
print_string:
pusha
string_loop:
mov al, [bx]
cmp al, 0
jne print_char
popa
ret
print_char:
mov ah, 0x0e
int 0x10
add bx, 1
jmp string_loop
;global vars
MESSAGE: db 'Example string',0xa,0
ANOTHER: db 'Another example string',0xa,0
;padding/magic number
times 510-($-$$) db 0
dw 0xaa55
唯一の問題は、文字列が本当に最後の下の1行を印刷しない一方で、新しい行は、画面上のx位置をリセットし、その代わりに前の文字列の下に直接印刷する、それは印刷していない、ということです直前の文字列の直前と直後。
出力例:
Example string
Another example string
文字列が前の列の下に直接印刷するように、私はこのコードを書くにはどうすればよいですか?
'CR'文字(0x0d)を追加する必要があります。 – Jester
'0xa'は命令ではありません。それはあなたがそれを使用している方法です。マシンコードのバイトとして '0x0a'を実行しようとすると、' OR r8、\t r/m8'(http://ref.x86asm.net/coder.html#x0A)としてデコードされます。 –
IMOこれは偶然のように動作します。この[int 10h、e](http://stanislavs.org/helppc/int_10-e.html)の記述によると、 'bh'と' bl'は引数ですが、オフセットとして 'bx'を使用しています。あなたのコードは非常に短く( 'ANOTHER' <256の終わり)、' bh'は '0'で、' bl'はグラフィックスモードでのみ色です。テキストモードでは無視されます。しかし、それがなぜ機能するのかを説明するコードにコメントをつけなければ、このような巧妙なトリッキーを勧めません。 – Ped7g