nasm如何使文本闪烁?

时间:2014-09-21 09:04:28

标签: assembly nasm bootloader

这是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中运行,或者我需要在软盘上编写程序并启动它来检查?

如果不能重新编写代码,可能会有一些消息。

1 个答案:

答案 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时它工作了! (当我把它放在闪存盘启动扇区并从此启动时,它当然也会眨眼)