Newline无法使用X86体系结构的NASM正确执行



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

如何编写此代码,以使字符串直接在上一个字符串下打印?

如何处理小丑的评论(与linefeed一起添加马车返回):

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

由于这是bootloader代码(times 510-($-$$) db 0 dw 0xaa55),并且org 0是默认值,因此最好明确地将DS段寄存器设置为零。不要相信您的执行环境!

xor     ax, ax
mov     ds, ax

将其放在其他任何东西之前。

最新更新