为什么在第二次调用打印功能后输出错误? (x86组装)

时间:2018-05-26 08:39:52

标签: assembly printing boot

我写了一个简单的汇编程序,由BIOS启动,我编写了一个函数,将寄存器(E)SI的内容输出到屏幕

我有一个名为msg的变量,它是一个字符串" Hello World1",0xa," Hello World2",0xa," Hello World3",0xa,0xa ,0x0

如果我使用该功能,输出将是:

Hello World1
Hello World2
Hello World3

但如果我使用它两次,那么输出将是这样的:

Hello World1
Hello World2
Hello World3

Hello World1
                          Hello World2
                          Hello World3

如果我两次使用打印功能,为什么会出错?

我的代码:

[ORG 0x7c00]

    xor     ax, ax
    mov     ds, ax
    mov     ss, ax
    mov     sp, 0x9c00
    mov     ax, 0xb800
    mov     gs, ax

    call    clear

    mov     si, msg
    mov     ah, 4
    call    print

    mov     si, msg
    mov     ah, 4
    call    print

    cli
    jmp     $

print:
    mov     bx, [vaddr]

write:
    lodsb
    cmp     al, 0
    je      end_write
    cmp     al, 0xa
    je      new_line
    mov     [gs:bx], ax
    add     bx, 2
    jmp     write

new_line:
    mov     cx, [vline]
    add     cx, 160
    mov     [vline], cx
    sub     cx, bx
    add     bx, cx

    jmp write

end_write:
    mov     [vaddr], bx
    ret

clear:
    mov     ah, 0
    mov     al, ' '
    xor     bx, bx

    mov     cx, 2000

clear_char:
    mov     [gs:bx], ax
    add     bx, 2
    loop    clear_char

    mov     byte [vaddr], 0
    mov     byte [vline], 0
    ret

msg:        db      "Hello World1", 0xa, "Hello World2", 0xa, "Hello World3", 0xa, 0xa, 0x0
vaddr:      db      0x0
vline:      dd      0

    times 510-($-$$) db 0
    db 0x55
    db 0xAA

感谢您的帮助

1 个答案:

答案 0 :(得分:4)

这些变量的定义:

vaddr:      db      0x0             BYTE
vline:      dd      0               DWORD

设置这些变量:

mov     byte [vaddr], 0             BYTE
mov     byte [vline], 0             BYTE

使用这些变量:

mov     bx, [vaddr]                 WORD
mov     cx, [vline]                 WORD 

只需确保在任何地方使用 WORD