;访问CMOS RAM
;
;编程:
; 以"年/月/日 时:分:秒" 的格式,显示当前的日期、时间
;
1 assume cs:code 2 3 data segment 4 db '9/8/7 4:2:0', '$' 5 data ends 6 7 code segment 8 start: 9 10 mov ax, data 11 mov ds, ax 12 mov bx, 0 13 mov di, 0 ;初始化参数 14 15 s: 16 mov al, [bx] ;al 传递的参数 注意此时al存放的是9的ASCII码 17 cmp al, '$' 18 je quit 19 call date 20 inc bx 21 jmp short s 22 23 ;注意:在s 与 jmp short s 之间不能修改di的值 24 25 26 ;-------------------------------- 27 ;显示时间的子程序 28 ;参数: 29 ; 1、al 在COMS RAM中存放时间的地址 30 ; 2、di 显示的偏移地址 初始位置 31 ; 32 ;-------------------------------- 33 date: 34 push ax 35 push bx 36 push cx 37 push es 38 39 mov bx, 0b800h 40 mov es, bx 41 mov bl, 0ah 42 43 ;================== 44 ;判断模块 45 ;================== 46 ;9/8/7 4:2:0 47 48 ;不是0~9的ASCII码 49 cmp al, 30h 50 jb showfen 51 cmp al, 39h 52 ja showfen 53 54 ;是0~9的ASCII码 55 sub al, 30h 56 57 cmp al, 9 58 je showdate 59 cmp al, 8 60 je showdate 61 cmp al,7 62 je showdate 63 cmp al, 4 64 je showdate 65 cmp al, 2 66 je showdate 67 cmp al, 0 68 je showdate 69 70 ;都不是则直接显示 71 add al, 30h 72 jne showfen 73 74 ;================== 75 ;显示时间模块 76 ;================== 77 showdate: 78 ;mov al, 9 al作为参数传递进来 79 out 70h, al 80 in al, 71h 81 mov ah, al 82 mov cl, 4 83 shr ah, cl 84 and al, 00001111b 85 86 ;ASCII才能显示 所有要转换成ASCII 87 add ah, 30h 88 add al, 30h 89 90 mov byte ptr es:[160*12+40*2+di], ah ;显示十位 91 mov byte ptr es:[160*12+40*2+di+1], bl 92 mov byte ptr es:[160*12+40*2+di+2], al ;显示个位 93 mov byte ptr es:[160*12+40*2+di+3], bl 94 add di, 4 95 jmp short dateend 96 97 ;================== 98 ;显示分割符模块 99 ;================== 100 showfen: 101 mov byte ptr es:[160*12+40*2+di], al ;显示分隔符 102 mov byte ptr es:[160*12+40*2+di+1], bl 103 add di, 2 104 105 dateend: 106 pop es 107 pop cx 108 pop bx 109 pop ax 110 111 ret 112 113 quit: 114 mov ax, 4c00h 115 int 21h 116 117 code ends 118 end start