如何在装配中以图形模式着色监视器

时间:2015-05-23 20:24:03

标签: assembly

你好为什么程序运行不正常 第一次运行很短的时间,显示改变颜色 但后来黑色又回来了 该程序将绘制一个标志但无法正确屏幕彩色图形模式

.model small
.stack 256
    org 100H
.data
.code
main proc 
    mov ax, @data
    mov ds, ax          
    call graphicsmode
    call printflag              

    mov ah,00
    mov al,03
    int 10h     

    mov ax,4c00h
    int 21h
main endp

graphicsmode proc
    MOV AH,00H
    MOV AL,13H
    INT 10H 
    ret
graphicsmode endp   

printflag proc      
    ;print color green
    ;--------------------------
    mov cx,50   ;column
    mov dx,50   ;row        
L1: mov ah,0CH
    mov al,2H   ;color pixel        
    mov bh,00H
    int 10h     
    inc cx
    cmp cx,400
    jne L1

    mov cx,50
    inc dx
    cmp dx,100
    jne L1  

    ;print color white  
    ;--------------------------
    mov cx,50   ;column
    mov dx,100  ;row        
L2: mov ah,0CH
    mov al,7H   ;color pixel        
    mov bh,00H
    int 10h     
    inc cx
    cmp cx,400
    jne L2

    mov cx,50
    inc dx
    cmp dx,150
    jne L2  

    ;print color red    
    ;--------------------------
    mov cx,50   ;column
    mov dx,150  ;row        
L3: mov ah,0CH
    mov al,4H   ;color pixel        
    mov bh,00H
    int 10h     
    inc cx
    cmp cx,400
    jne L3

    mov cx,50
    inc dx
    cmp dx,200
    jne L3  
    ret
printflag endp

end main

1 个答案:

答案 0 :(得分:1)

对于模式0x13,您可以使用“rep stosw”指令填充屏幕,如下所示:

    ;al = colour to use

    mov bx,0xA000
    mov es,bx
    mov cx,320*200/2
    mov di,0
    cld
    mov ah,al
    rep stosw

如果你一次只做一个像素,那么你需要计算“地址= y * 320 + x”64000次,这是非常缓慢和毫无意义的。它还意味着您一次写入一个字节,并且在PCI总线上最多可以传输64000个传输(您可以通过一次执行2个字节,或者一次执行4个字节来减少传输次数)。 / p>

使用BIOS功能要差得多。它以一个中断开始(这很慢)然后有一大堆分支来确定你想要的功能,然后有另一堆分支来确定你正在使用哪种视频模式,并且毕竟它具有所有的功能“一次一个像素”的问题(如上所述)。

基本上;你的代码有2个问题 - 它需要重新设计/重写,它有bug。如果您发现并修复了错误,它仍然需要重新设计/重写;所以没有必要找到并修复错误。