汇编语言实现实时时钟显示.docx
汇编语言实现实时时钟显示汇编语言实现实时时钟显示 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 ;获取系统时间,chhours clminutes DHseconds,均为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使用显示服务的向上卷屏功能 mov al,00h ;AL滚动行数,0为整个窗口 mov bh,ds:color ;BH显示页面 mov ch,0 mov cl,0 ;CH,CL窗口左上角坐标 mov dh,24 mov dl,79 ;DH,DL窗口右下角坐标,因为清全屏所以为 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