当前位置:文档之家› 汇编语言实现实时时钟显示

汇编语言实现实时时钟显示

汇编语言实现实时时钟显示
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
push ax
push bx
push cx
push dx
mov ah,06h ;AH使用显示服务(INT 10H)的向上卷屏功能(06H)mov al,00h ;AL滚动行数,0为整个窗口
mov bh,ds:color ;BH显示页面(本程序均使用第0页)
mov ch,0
mov cl,0 ;CH,CL窗口左上角坐标
mov dh,24
mov dl,79 ;DH,DL窗口右下角坐标,因为清全屏所以为(0,0)~(24,79)int 10h ;调用中断
pop dx
pop cx
pop bx
pop ax
ret
flash endp
HideCursor proc
push ax
push dx
push bx
mov ah,02
mov dh,24
mov dl,00
mov bh,00
int 10H
pop bx
pop dx
pop ax
ret
HideCursor endp
code ends
end start。

相关主题