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