实验内容
编程:以“年/月/日 时:分:秒”的格式,显示当前的日期、时间。——《汇编语言(第三版)》王爽老师著。
背景知识
在CMOS RAM中,存放这当前的时间:年、月、日、时、分、秒。这6个信息的长度都为1个字节,存放单元为:
秒:0 分:2 时:4 日:7 月:8 年:9
这些数据以BCD码的方式存放。
BCD码是以4位二进制表示十进制数码的编码方式,如下所示:
十进制码: 0 1 2 3 4 5 6 7 8 9
对应的BCD码:0000 0001 0010 0011 0100 0101 0110 0111 1000 1001
比如:数值26,用BCD码表示为0010 0110,高4位=2,低四位=6。
可见,一个字节表示两个BCD码。则CMOS RAM存储时间信息的单元中,存储了用两个BCD码表示的两位十进制数,高4位的BCD码表示十位,低4位的BCD码表示各位。
思路
既然实验的内容是以“年/月/日 时:分:秒”的格式,显示当前的日期、时间,通过背景知识得知,时分秒占8位,年月日占4位,那么可以分开循环处理:
- 从末位开始,倒序处理日期信息,并以'/'隔开,在屏幕显示,如22/08/13
- 从第四位开始逆序,处理时间信息,并以':'隔开,在屏幕显示,如16:10:10
代码实现
assume cs:code,ss:stack
stack segment
db 8 dup(0)
db 8 dup(0)
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,10h
mov bx,0b800h
mov es,bx
mov bx,160*12 ;第12行
mov si,25*2 ;第25列
xor ax,ax
mov cx,3 ;处理年月日
mov al,9
ldate: call pdate
dec al
add si,6
loop ldate
mov word ptr es:[bx][si-2],20h ;移除多出的'/'
xor ax,ax
mov cx,3 ;处理时分秒
mov al,4
ltime: call ptime
sub al,2
add si,6
loop ltime
mov word ptr es:[bx][si-2],20h ;;移除多出的':'
mov ax,4c00h
int 21h
pdate: push ax
push cx
out 70h,al ;向地址端口70h写入要访问的单元的地址,al由外部传入
in al,71h ;从数据端口71h中取得指定单元中的数据
mov ah,al ;(ah)=十位,(al)=个位
mov cl,4 ;位移向量
shr ah,cl ;(ah)=十位右移,高位补0
and al,00001111b ;与运算,丢弃al高4位
add ah,30h ;转为ASCII码
add al,30h ;转为ASCII码
mov byte ptr es:[bx][si],ah ;
mov byte ptr es:[bx][si+2],al ;
mov byte ptr es:[bx][si+4],2fh ; 插入'/',如yy/MM/dd
pop cx
pop ax
ret
ptime: push ax
push cx
out 70h,al ;向地址端口70h写入要访问的单元的地址,al由外部传入
in al,71h ;从数据端口71h中取得指定单元中的数据
mov ah,al ;(ah)=十位,(al)=个位
mov cl,4 ;位移向量
shr ah,cl ;(ah)=十位右移,高位补0
and al,00001111b ;与运算,丢弃al高4位
add ah,30h ;转为ASCII码
add al,30h ;转为ASCII码
mov byte ptr es:[bx][si],ah ;
mov byte ptr es:[bx][si+2],al ;
mov byte ptr es:[bx][si+4],3ah ; 插入':',HH:mm:ss
pop cx
pop ax
ret
code ends
end start