2016-11-28 8 views
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 

文字列が前の列の下に直接印刷するように、私はこのコードを書くにはどうすればよいですか?

+2

'CR'文字(0x0d)を追加する必要があります。 – Jester

+0

'0xa'は命令ではありません。それはあなたがそれを使用している方法です。マシンコードのバイトとして '0x0a'を実行しようとすると、' OR r8、\t r/m8'(http://ref.x86asm.net/coder.html#x0A)としてデコードされます。 –

+1

IMOこれは偶然のように動作します。この[int 10h、e](http://stanislavs.org/helppc/int_10-e.html)の記述によると、 'bh'と' bl'は引数ですが、オフセットとして 'bx'を使用しています。あなたのコードは非常に短く( 'ANOTHER' <256の終わり)、' bh'は '0'で、' bl'はグラフィックスモードでのみ色です。テキストモードでは無視されます。しかし、それがなぜ機能するのかを説明するコードにコメントをつけなければ、このような巧妙なトリッキーを勧めません。 – Ped7g

答えて

1

ジェスターさんのコメント(改行と一緒にキャリッジリターンを追加)をどうするか:

MESSAGE: db 'Example string',13,10,0 
ANOTHER: db 'Another example string',13,10,0 

Ped7gさんのコメント(SIとセットアップへの変更BXBLBH引数)をどうするか:

mov bx, 0007h  ;Display page 0, graphics color 7 
mov si, MESSAGE 
call print_string 
... 
string_loop: 
    mov al, [si] 
    ... 
    add si, 1 
    jmp string_loop 
このブートローダーコードである( times 510-($-$$) db 0 dw 0xaa55)Aので

ORG 0がデフォルトである場合、DSセグメントレジスタを0に明示的に設定することをお勧めします。このために実行環境を信頼しないでください!

xor  ax, ax 
mov  ds, ax 

他に先に入れてください。