2014-09-21 42 views
0

這是bootloader的代碼。nasm如何讓文字閃爍?

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

假設您的視頻卡兼容VGA,請嘗試維基鏈接[VGA文本模式](http:// en .wikipedia.org /維基/ VGA-compatible_text_mode) – rcgldr 2014-09-22 04:00:32

回答

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它工作! (當我把它放在一個閃存盤啓動扇區並從此啓動時,它當然也閃爍)