【发布时间】:2016-03-09 14:09:04
【问题描述】:
我需要使用中断 10h 的函数 06h 来实现滚动队列。问题是我有滚动线,但符号没有出现,光标消失了,什么也没有发生。也许我忘记了要考虑的事情?要编写代码,我使用FASM。该代码是引导加载程序的一部分。这是与滚动相关的一段代码:
cmp cx, 2001
je ScrollLine
我有一个计数器,当它达到 2001(从 1 开始计数)时,控制权传递给 ScrollLine。
滚动线:
mov ah, 06h
mov al, 1
mov bh, 07
mov cx, 0000h
mov dx, 184Fh
int 10h
ret
我完整的bootloader代码如下:
use16
org 7C00h
start:
mov ah, 00h
mov al, 02h
int 10h
mov ax, NewInt40
call ChangeIVT
mov cx, 0
wait_loop:
xor ax, ax
inc cx
cmp cx, 2001
je ScrollLine
mov ah, 0
int 16h
push ax
call PrintChar
jmp wait_loop
NewInt40:
sti
push ax
mov ax, msg
cmp bl, 3
je PrintChar
cmp bl, 2
je PrintString
cmp bl, 1
je Clear
cmp bl, 4
je Scroll
pop ax
iret
ChangeIVT:
push bx
xor bx, bx
mov es, bx
mov bx, 40h
shl bx, 2
mov word [es:bx], ax
mov word [es:bx+2], 0
pop bx
ret
PrintString:
push si
push bx
push es
mov si, ax
mov ax, 0B800h
mov es, ax
xor bx, bx
xor dx, dx
@@:
lodsb
cmp al, 0
je @f
mov byte [es:bx], al
mov byte [es:bx+1], 1Eh
mov ah, 0Eh
add bx, 2
inc dx
mov ah,02h
mov al,02h
int 10h
jmp @b
@@:
pop es
pop bx
pop si
ret
PrintChar:
push bp
mov bp, sp
push bx
push es
push cx
mov ax, 0B800h
mov es, ax
xor bx, bx
xor dx, dx
mov ah,3
int 0x10
movzx ax, dh
movzx bx, dl
mov cx, 80
push dx
mul cx
pop dx
add bx, ax ; bx = 80 * dh + dl
shl bx, 1 ; bx = 2 * (80 * dh + dl)
mov ax, [bp + 4]
mov byte [es:bx], al
mov byte [es:bx+1], 1Eh
cmp dl, 79
jl @f
inc dh
mov dl, -1
@@:
inc dl
pop cx
mov bh, 0
mov ah, 2
int 0x10
pop es
pop bx
mov sp, bp
pop bp
ret
Clear:
mov AH,0
mov AL,2
int 10H
ret
Scroll:
mov ah, 06h
mov al, 1
mov bh, 07
mov cx, 0000h
mov dx, 184Fh
int 10h
ret
ScrollLine:
mov bl, 4
int 40h
xor cx, cx
ret
msg db "Hello, world!", 0Dh, 0Ah, 0
db 510-($-$$) dup (0)
db 55h, 0AAh
【问题讨论】:
-
所以你正在制作例如一个 09h 之后显示一个字符,那是问题出现的时候?文本滚动,但您随后遇到了输出问题?
-
你能再贴一些代码吗? This 简单的演示程序(用于 NASM)使用与您相同的中断调用并且工作正常。
-
@MargaretBloom:有点吹毛求疵,但在您的代码中,当您创建 COM 程序(我假设来自 org 100h)时,设置 SS:SP、DS 等有什么意义? DOS 加载程序自动加载 COM 程序并将它们全部设置到同一段,并在 64k 段的顶部适当地设置堆栈。 CS=DS=SS 都指向 PSP 段的开始。
-
@MichaelPetch。噢 .. 引导加载程序编码的坏习惯。 :)
-
@Tommy 是的。我有一个处理键盘输入的循环。
wait_loop: xor ax, ax inc cx cmp cx, 2001 je ScrollLine mov ah, 0 int 16h jmp wait_loop
标签: assembly x86 bootloader fasm video-memory