;ex14_1.exe
;按指定格式(年/月/日 时:分:秒)在屏幕中显示CMOS RAM中的时间内容
;思路:按P263的(3)中的思路,将地址组在一起,
;再将要提取的单元数组在一起(本例中每个数据只有1字节,所以本步省略),分别喂食给 处理模块
assume cs:code
code segment
;地址编组
s1: db 9,8,7,4,2,0
;预留字符串内存空间 - 每个字节拆分出2个ASCII
s2: db '--/--/-- --:--:--','$'
;处理模块
;字节转为ASCII(需具备功能:将任意长度的字节——提取为BCD——再转为DEC十位、个位——再转为ASCII)
;这么多要显示的字符,不可能用寄存器存储,要在data中预申请内存空间。以$结尾,可调用 int 21的9号子程序
;接受ds:[si]为源字节,处理得到的结果存储进ds:[di]
start: mov ax,cs
mov ds,ax
mov si,offset s1
mov di,offset s2
lp: mov al,[si]
out 70h,al
in al,71h
mov ah,al
mov cl,4
shr ah,cl
and al,00001111b
add ah,30h
add al,30h
mov byte ptr [di],ah;DEC十位
mov byte ptr [di+1],al;DEC个位
cmp byte ptr [si],0
je display
inc si
add di,3
jmp short lp
display:
;显示模块(用到视频缓冲区)
;int 10h的2号子程序,置光标
mov ah,2
mov bh,0
mov dh,12
mov dl,30
int 10h
;int 21h的9号子程序,在光标处显示字符串
mov dx,offset s2
mov ah,9
int 21h
mov ax,4c00h
int 21h
code ends
end start
;lp中未使用jcxz是因为中间使用了cl,虽然通过 push cx,使用cl,pop cx,仍可使用jcxz。但代码会变冗长
;ex14_2.exe
;按指定格式(年/月/日 时:分:秒)在屏幕中显示CMOS RAM中的时间内容
;(使用传统单字节传送法)
;思路:按P263的(3)中的思路,将地址组在一起,
;再将要提取的单元数组在一起(本例中每个数据只有1字节,所以本步省略),分别喂食给 处理模块
assume cs:code
code segment
;地址编组
s1: db 9,8,7,4,2,0
;预留字符串内存空间 - 每个字节拆分出2个ASCII
s2: db '--/--/-- --:--:--','$'
;处理模块
;字节转为ASCII(需具备功能:将任意长度的字节——提取为BCD——再转为DEC十位、个位——再转为ASCII)
;这么多要显示的字符,不可能用寄存器存储,要在data中预申请内存空间。以$结尾,可调用 int 21的9号子程序
;接受ds:[si]为源字节,处理得到的结果存储进ds:[di]
start: mov ax,cs
mov ds,ax
mov si,offset s1
mov di,offset s2
lp: mov al,[si]
out 70h,al
in al,71h
mov ah,al
mov cl,4
shr ah,cl
and al,00001111b
add ah,30h
add al,30h
mov byte ptr [di],ah;DEC十位
mov byte ptr [di+1],al;DEC个位
cmp byte ptr [si],0
je display
inc si
add di,3
jmp short lp
display:
;显示模块(用到视频缓冲区),使用传统单字节传送法
mov ax,0b800h
mov es,ax
mov si,offset s2
mov dh,12
mov dl,30
;计算di
mov al,160
mul dh;dh*160的结果存入AX
mov dh,0
shl dl,1;dl*2的结果存入DX
add ax,dx
mov di,ax
lp1: cmp byte ptr [si],'$'
je lp1e;end of lp1
mov al,[si]
mov es:[di],al
inc si
add di,2
jmp short lp1
lp1e: mov ax,4c00h
int 21h
code ends
end start
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/44abb2a88471a4082f1c6c59e9821282.png)