主题:数字时钟,键盘监控有问题
写了个程序,动态显示数字时钟,本来要求程序开始等待击键活动才显示时钟。而后击空格键返回DOS。可是我的程序一运行就显示出了时钟,并没有循环检测是否有击键。而且一运行就停不下来。改来改去总不对,烦死了,帮忙看下
assume cs:code
code segment
time db 'hh:mm:ss',13,10,'$'
string db 'press any key to continue...',13,10,'$'
cmos db 4,2,0
start:
;装入代码段的段地址
mov ax,cs
mov ds,ax
mov dx,offset string ;取得字符串的偏移地址
mov ah,9
int 21H ;调用DOS显示字符串
check:
;读取键盘的输入状态
mov dl,0ffH
mov al,06H
mov ah,0cH
int 21H
inc al ;如键盘有击键,al为OFFH。否则为00H
loopnz check
again:
;寄存器初始化
mov bx,0
mov si,0
mov cx,3
second:
push cx
mov al,cmos[bx]
out 70h,al ;将al送入地址端口70h
in al,71h ;从数据端口71h处读出单元内容
mov ah,al
mov cl,4
shr al,cl ;右移4位
and ah,0fh ;al分成两个表示BCD码值的数据
add ax,3030h ;BCD码+30h=10进制数对应的ASCII码
mov cs:[si],ax ;ASCII码写入time段
inc bx
add si,3 ;si加上3,指向当前位置的后面第三个位置
pop cx
loop second
;名称:BIOS中断(int 10h)
;功能:(ah)=2置光标到屏幕指定位置、(ah)=9在光标位置显示字符
;参数:(al)=字符、(bh)=页数、(dh)=行号、(dl)=例号
; (bl)=颜色属性、(cx)=字符重复个数
mov ah,2 ;置光标
mov bh,0 ;第0页
mov dh,20 ;dh中放行号
mov dl,30 ;dl中放例号
int 10h
;名称:DOS中断(int 21h)
;功能:(ah)=9显示用'$'结束的字符串、(ah)=4ch程序返回
;参数:ds:dx指向字符串、(al)=返回值
mov dx,0
mov ah,9
int 21h
;调用0C功能清空键盘缓冲区并调用06号键盘功能
mov dl,0ffH
mov ah,0cH
mov al,06H
int 21H
cmp al,0 ;判断是否有字符可读,如没有则al为0
je again ;没有字符可取,跳转到程序的开始
cmp al,0EH ;如果有击键活动,则获取击键的扫描码,如果输入为空格则程序结束
je exit
jmp again ;如果输入的不是空格键,则无条件跳转到开始
;结束
exit:
mov ax,4c00h
int 21h
code ends
end start
assume cs:code
code segment
time db 'hh:mm:ss',13,10,'$'
string db 'press any key to continue...',13,10,'$'
cmos db 4,2,0
start:
;装入代码段的段地址
mov ax,cs
mov ds,ax
mov dx,offset string ;取得字符串的偏移地址
mov ah,9
int 21H ;调用DOS显示字符串
check:
;读取键盘的输入状态
mov dl,0ffH
mov al,06H
mov ah,0cH
int 21H
inc al ;如键盘有击键,al为OFFH。否则为00H
loopnz check
again:
;寄存器初始化
mov bx,0
mov si,0
mov cx,3
second:
push cx
mov al,cmos[bx]
out 70h,al ;将al送入地址端口70h
in al,71h ;从数据端口71h处读出单元内容
mov ah,al
mov cl,4
shr al,cl ;右移4位
and ah,0fh ;al分成两个表示BCD码值的数据
add ax,3030h ;BCD码+30h=10进制数对应的ASCII码
mov cs:[si],ax ;ASCII码写入time段
inc bx
add si,3 ;si加上3,指向当前位置的后面第三个位置
pop cx
loop second
;名称:BIOS中断(int 10h)
;功能:(ah)=2置光标到屏幕指定位置、(ah)=9在光标位置显示字符
;参数:(al)=字符、(bh)=页数、(dh)=行号、(dl)=例号
; (bl)=颜色属性、(cx)=字符重复个数
mov ah,2 ;置光标
mov bh,0 ;第0页
mov dh,20 ;dh中放行号
mov dl,30 ;dl中放例号
int 10h
;名称:DOS中断(int 21h)
;功能:(ah)=9显示用'$'结束的字符串、(ah)=4ch程序返回
;参数:ds:dx指向字符串、(al)=返回值
mov dx,0
mov ah,9
int 21h
;调用0C功能清空键盘缓冲区并调用06号键盘功能
mov dl,0ffH
mov ah,0cH
mov al,06H
int 21H
cmp al,0 ;判断是否有字符可读,如没有则al为0
je again ;没有字符可取,跳转到程序的开始
cmp al,0EH ;如果有击键活动,则获取击键的扫描码,如果输入为空格则程序结束
je exit
jmp again ;如果输入的不是空格键,则无条件跳转到开始
;结束
exit:
mov ax,4c00h
int 21h
code ends
end start