1

0xa最後に印刷された文字列が次の文字列にならないように、文字列の末尾にある命令を使用して改行を作成しています。

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

文字列が前の文字列のすぐ下に出力されるようにするには、このコードをどのように記述すればよいですか?

4

1 に答える 1

2

Jester のコメントをどうするか (改行の横にキャリッジ リターンを追加):

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

Ped7g のコメントをどうするか (と引数に変更BXSIて設定します):BLBH

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) であり、ORG 0 がデフォルトであるため、DSセグメント レジスタを明示的にゼロに設定することをお勧めします。これについては、実行環境を信頼しないでください。

xor     ax, ax
mov     ds, ax

これを何よりも優先してください。

于 2016-12-04T21:36:16.457 に答える