这是bootloader的代码。
BITS 16
start:
mov ax, 07C0h
add ax, 288
mov ss, ax
mov sp, 4096
mov ax, 07C0h
mov ds, ax
cycle:
mov si, message1
call show_messages
mov si, message2
call show_messages
mov si, message3
call show_messages
jmp $
message1 db 13,10,"Message 1",13,10,0
message2 db 13,10,"Message 2",13,10,0
message3 db 13,10,"Message 3,10,0
show_messages:
mov ah, 0Eh
repeat:
lodsb
cmp al, 0
je END
int 10h
jmp repeat
END:
ret
times 510-($-$$) db 0
dw 0xAA55
我需要发消息才能闪烁,如果可以改变颜色和消息从右向左移动。如何改善这个?这个代码是否可以在virtualbox中运行,或者我需要在软盘上编写程序并启动它来检查?
如果不能重新编写代码,可能会有一些消息。
答案 0 :(得分:0)
我想,你需要写入视频内存。在视频内存(0xB800)中,屏幕上的每个字符(文本模式下为80x25)都有一个属性,如果字符闪烁,则控制其最高位控制。因此,如果你将这些设置为1,它应该闪烁。
BITS 16
start:
mov ax, 07C0h
add ax, 288
mov ss, ax
mov sp, 4096
mov ax, 07C0h
mov ds, ax
mov AX,0xB800 ; set up to the video memory
mov ES,AX
mov CX,80 * 25 * 2 - 1 ; size of video memory
mov BX,1
Loop: ; do through on the video memory
cmp BX,CX ; exit if we finished
ja Exit
or byte [ES:BX],10000000b ; set the highest bit to 1 (enable blinking)
add BX,2 ; go to the next character
jmp Loop
Exit:
cycle:
mov si, message1
call show_messages
mov si, message2
call show_messages
mov si, message3
call show_messages
jmp $
message1 db 13,10,"Message 1",13,10,0
message2 db 13,10,"Message 2",13,10,0
message3 db 13,10,"Message 3",10,0
show_messages:
mov ah, 0Eh
repeat:
lodsb
cmp al, 0
je END
int 10h
jmp repeat
END:
ret
times 510-($-$$) db 0
dw 0xAA55
我是从www.supernovah.com学到的 重要!对我来说,qemu和virtualbox没有闪烁文本(我尝试在Windows上),但是当我在我的Android设备上尝试使用bochs时它工作了! (当我把它放在闪存盘启动扇区并从此启动时,它当然也会眨眼)