Почему вывод неверен после второго вызова моей функции печати?(сборка x86) - PullRequest
0 голосов
/ 26 мая 2018

Я написал простую программу сборки, которая загружается 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 голосов
/ 26 мая 2018

Определение этих переменных:

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 везде!

...