对于 x86 架构,使用 nasm 无法正确执行换行符

Newline not executing properly using nasm for x86 architecture

我在字符串末尾使用指令 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

唯一的问题是,虽然字符串确实在最后一行的下方打印一行,但新行不会重置屏幕上的 x 位置,因此它不会直接打印在前一个字符串的下方,而是打印在下方并且就在前一个字符串之后。

示例输出:

Example string
              Another example string

如何编写这段代码,以便字符串直接打印在前一个字符串的下面?

如何处理 Jester 的评论(在换行符旁边添加回车 return):

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

如何处理 Ped7g 的评论(将 BX 更改为 SI 并设置 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

把这个放在第一位。