注册 登录
编程论坛 汇编论坛

求教下,为什么前景和背景会闪烁

xiexiejohn 发布于 2014-04-15 21:30, 687 次点击
奇怪是把下面in al,60h改成int 16h 显示倒是正常(这是王爽实验17-2内容中的一个子程序,所以只能用in al,60h而不能用能让程序停下来等待用户输入的int 16h功能)
assume cs:code
code segment
main:
in al,60h     ;读取键盘端口
cmp al,1h     ;esc键?
je clockexit     ;是退出,返回主莱单
cmp al,03bh     ;F1?
je F1
cmp al,03ch     ;F2?
je F2
jmp clockcon

F1:
mov dx,0     ;改前景
call color
jmp clockcon

F2:
mov dx,1     ;改背景
call color

clockcon:
jmp main
clockexit:
mov ax,4c00h
int 21h


color:     ;改前,背景色(颜色值0~7),dx表示调用功能号 dx=0为前景色,dx=1为背景色
push es
push di
push cx
push dx
push ax
push bx

jmp colorstart
colorda db 0,0     ;colorda[0]保存前景色值,colorda[1]保存背景色值

colorstart:
mov cx,0b800h
mov es,cx
mov cx,2000
mov di,1
mov ax,0
mov bx,dx

cmp colorda[bx],7    ;用定址表判断颜色值
jnb ab     ;大于或等于7,跳转
inc colorda[bx]     ;小于7直接加1
mov al,colorda[bx]    ;读取要写屏的颜色
jmp write

ab:
mov colorda[bx],0    ;如果颜色值大于或等于7那么重新置0
mov al,colorda[bx]    ;读取要写屏的颜色
jmp write


;改变颜色
write:
mov ah,es:[1]     ;先读取当前屏幕字符颜色
cmp bx,1     ;判断功能号,如果1改背景,0改前景色
je colback     ;为1跳到改背景
;否则改前景
and ah,11111000b    ;只把前景颜色删除,保留其它属性(字符可能还有背景颜色和闪烁特效,这些不能册)
jmp colconv   

colback:     ;背景颜色
and ah,10001111b    ;只删掉背景色保留其它属性(字符可能还有前景颜色和闪烁特效,这些不能册)
shl al,1
shl al,1
shl al,1
shl al,1

colconv:     ;进入改变字符颜色过程
or al,ah     ;确定当前将要写入的字符颜色
coldo:
mov es:[di],al
add di,2
loop coldo

colorexit:
pop bx
pop ax
pop dx
pop cx
pop di
pop es
ret
code ends
end main
3 回复
#2
xkwy00002014-04-16 09:55
如果不使用int 16,一般就得忙等(循环等待输入),我试过,效果不好。
#3
xiexiejohn2014-04-16 22:18
但是用了,就不符合书上要求,书上要动态显示当前时间如果用int16h 会变成按一下才更新一下时间。。。
是不是跳到f1处理那里然后马上到键盘里内值清光键值。。。?怎么到到键盘缓冲区里清
#4
xkwy00002014-04-17 06:18
读时钟使用int 1a; ah=0。一般也需要循环判断忙等。
使用int 1a; ah=6  ,定时报警最好。我的电脑最小时间单位是1/18秒。
不过象键盘中断一样,如果想用得很好,又没有参考资料的话,
只能读中断程序,参考着做了
1