你好为什么程序运行不正常 第一次运行很短的时间,显示改变颜色 但后来黑色又回来了 该程序将绘制一个标志但无法正确屏幕彩色图形模式
.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
答案 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。如果您发现并修复了错误,它仍然需要重新设计/重写;所以没有必要找到并修复错误。