首页 文章

将字符写入视频缓冲区MASM

提问于
浏览
1

我试图通过将其移动到视频缓冲区,在白色背景上用蓝色写字母'D' . 这段代码有什么问题?

INCLUDE Irvine16.inc

.code
main PROC

mov ax,@data
mov ds,ax

mov si, 0b800h
mov word ptr [si], 44h
mov word ptr [si+2] 0701h

mov ah, 08h
int 21h

exit

main ENDP

对上面做了修改 . 它现在组装,但什么也没显示 .

3 回答

  • -1

    示例示例:

    name "hello-world"
    org 100h
    
    ; set video mode     
    mov ax, 3     ; text mode 80x25, 16 colors, 8 pages (ah=0, al=3) 
    int 10h       ; do it! 
    
    ; cancel blinking and enable all 16 colors: 
    mov ax, 1003h
    mov bx, 0
    int 10h
    
    
    ; set segment register: 
    mov     ax, 0b800h
    mov     ds, ax
    
    ; print "hello world" 
    ; first byte is ascii code, second byte is color code. 
    
    mov [02h], 'h'
    
    mov [04h], 'e'
    
    mov [06h], 'l'
    
    mov [08h], 'l'
    
    mov [0ah], 'o'
    
    mov [0ch], ','
    
    mov [0eh], 'w'
    
    mov [10h], 'o'
    
    mov [12h], 'r'
    
    mov [14h], 'l'
    
    mov [16h], 'd'
    
    mov [18h], '!'
    
    
    
    
    ; color all characters: 
    mov cx, 12  ; number of characters. 
    mov di, 03h ; start from byte after 'h' 
    
    c:  mov [di], 11101100b   ; light red(1100) on yellow(1110) 
        add di, 2 ; skip over next ascii code in vga memory. 
        loop c
    
    ; wait for any key press: 
    mov ah, 0
    int 16h
    
    ret
    

    希望这个样本可以帮助你

  • 1

    1)0b800h是视频缓冲区的 segment 地址 . mov word ptr [si], 44h 仅解决 DS 中段地址的 offset (此处:0b800h) - 而 DS 未指向视频缓冲区 . 我建议将视频片段加载到 ES 并使用段覆盖( ES: ) .

    2)字母加颜色一起形成一个单词 . 在视频缓冲区中首先是字母然后是颜色 . 背景和前景色使用每个半字节(4位) . 由于“小端字节”(google for it),单词应该具有格式颜色/字母,例如白色/蓝色/'D'= 7144h

    这是与Irvine16兼容的示例:

    INCLUDE Irvine16.inc
    INCLUDELIB Irvine16.lib
    
    .CODE
    main PROC
    ;   mov ax,@data                ; No .DATA in this example
    ;   mov ds,ax
    
        mov si, 0b800h              ; Initialize ES with video buffer
        mov es, si
    
        xor si, si                  ; Position 0 is top left
        mov word ptr es:[si], 7144h ; White background ('7'), blue foreground (1), letter 'D' (44)
    
        mov ah, 08h                 ; Wait for key - http://www.ctyme.com/intr/rb-2561.htm
        int 21h
    
        exit                        ; Irvine16: end of program
    main ENDP
    
    END main
    
  • 2

相关问题