我写了一个简单的汇编程序,由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
感谢您的帮助
答案 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 !