;以 年/月/日 时:分:秒 的格式 居中显示当前日期时间
;年-9 月-8 日-7 | 时-4 分-2 秒-0 --> 总计17字节
;偏移计算 行 25/2=12.5 -> 13 | 列 80/2-17/2=31.5 -> 31
; es:0B800H , di:07BCH | 12*80*2+30*2=1982 -> 07BCH
assume cs:code
code segment
start:
;设置目的段
mov ax,0B800H
mov es,ax
mov di,07BCH
;清屏
mov bx,0
mov cx,0FA0H
start_s00:
mov byte ptr es:[bx],1
inc bx
loop start_s00
;循环设置颜色 -> 2 绿色
mov cx,17
start_s0:
mov bx,cx
shl bx,1
mov byte ptr es:[di + bx - 1],2 ;无寄存器时,要确认操作单位!
loop start_s0
;设置年月日
mov cx,3
start_s1:
push cx
;读取BCD
mov al,6 ;偏移 cx + 6
add al,cl
out 70H,al
in al,71H
;BCD转ASCII
mov cl,4
mov ah,al
and al,00001111B
shr ah,cl
add al, add ah, ;显示
;偏移 di + (3 - cx)* (2 + 2 + 2)
pop cx ;cx作为可能被修改的寄存器之一,如果需要读取原始数据,一定要先判别其 cx 是否等于 原始数据!
mov bx,3
sub bx,cx
shl bx,1
mov dx,bx ;连续加法前应注意其本身就存有一个数据!
add bx,dx
add bx,dx
mov byte ptr es:[di + bx],ah
mov byte ptr es:[di + bx + 2],al
cmp cx,1
je start_s1_end
mov byte ptr es:[di + bx + 2 + 2], loop start_s1
start_s1_end:
mov byte ptr es:[di + bx + 2 + 2], ;设置时分秒 4-2-0
add di,12H
mov cx,3
start_s2:
push cx
;读取BCD
mov al,cl ;偏移 (cx - 1)*2
sub al,1
shl al,1
out 70H,al
in al,71H
;BCD转ASCII
mov cl,4
mov ah,al
and al,00001111B
shr ah,cl
add al, add ah, ;显示
;偏移 di + (3 - cx)* (2 + 2 + 2)
pop cx
mov bx,3
sub bx,cx
shl bx,1
mov dx,bx
add bx,dx
add bx,dx
mov byte ptr es:[di + bx],ah
mov byte ptr es:[di + bx + 2],al
cmp cx,1
je start_s2_end
mov byte ptr es:[di + bx + 2 + 2], loop start_s2
start_s2_end:
mov ax,4C00H
int 21H
code ends
end start