汇编语言实现实时时钟显示
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
汇编语言实现实时时钟显示
data segment
msg db 'Current time is: '
hours db ?,?
db ':'
minutes db ?,?
db ':'
seconds db ?,?,0
oldint1c dd ? ;旧的入口参数
position dw 0 ;时间显示位置
color db 07h
data ends
code segment ;代码段
assume cs:code,ds:code
start:
mov ax,data
mov ds,ax
jmp run
newint1c: push ax
push bx
push cx
push dx
push si
push di
push es
mov ax,data
mov ds,ax
mov ax,0200h ;获取系统时间,ch→hours cl→minutes DH→seconds,均为BCD码格式
int 1ah ;时钟服务
mov al,ch
lea si,hours ;时
call BCD
mov al,cl
lea si,minutes ;分
call BCD
mov al,dh
lea si,seconds ;秒
call BCD
mov ax,0b800h ;显存地址,采用直接写显存的方法输出字符
mov es,ax ;es:di 指向显存地址
lea si,position ;设置时间显示位置
mov di,[si]
lea si,msg
disp: mov al,[si]
inc si
or al,al
jz exit
cld
stosb
inc di
jmp disp
exit: pop es
pop di
pop si
pop dx
pop cx
pop bx
pop ax
jmp ds:oldint1c ;执行旧的中断服务程序
BCD proc
push ax ;用于将BCD码转换为ASCII码入口al-BCD码
mov ah,al ;出口
shr ah,1
shr ah,1
shr ah,1
shr ah,1
and al,0fh
add ax,'00' ;加上0的ASCII码
xchg ah,al
mov [si],ax
pop ax
ret
BCD endp
run:
mov ax,data
mov ds,ax
mov ax,351ch ;获取原1ch的入口参数
int 21h
mov word ptr ds:oldint1c,bx ;保存旧的入口参数
mov word ptr ds:oldint1c+2,es
push ds
push cs
pop ds
lea dx,newint1c
mov ax,251ch ;设置新1ch的入口参数
int 21h
pop ds
mov dx,offset run + 10h ;1节=16字节
mov cl,4
shr dx,cl ;相当于除以16以计算节大小
call Control ;调用控制子程序
call flash
mov ah,31h ;结束并驻留, DX:保留的长度(内存大小单位为节)
int 21h
Control proc
push ax
push cx
push bx
call HideCursor ;隐藏光标
xor bx,bx ;置0,时间显示位置
getkey: mov ah,0 ;获取键盘扫描码
int 16h
cmp ax,011bh ;esc-011bh
jz return
cmp ax,4800h ;up-4800h
jz up
cmp ax,5000h ;down-5000h jz down
cmp ax,4b00h ;left-4b00h jz left
cmp ax,4d00h ;right-4d00h jz right
jmp changeColor ;
up: cmp bx,160
jc getkey
sub bx,160
jmp changePos
down: add bx,160
jmp changePos
left: cmp bx,0
jz getkey
sub bx,2
jmp changePos
right: add bx,2
changePos: call flash
mov ds:position , bx
jmp getkey
changeColor:
;sub al,30h
mov ds:color,ah
call flash
jmp getkey
return: pop bx
pop cx
pop ax
ret
Control endp
flash proc