在屏幕中间显示当前的月份

1、从 CMOS RAM 的8号单元读出当前月份的 BCD 码;
要读取 CMOS RAM 的信息,首先要向地址端口 70h 写入要访问的单元的地址:
mov al , 8
out 70h , al
然后从数据端口 71h 中取得指定单元中的数据:
in al , 71h
2、将用BCD码表示的月份以十进制的形式显示到屏幕上;
BCD码值=十进制数码值,BCD码值+30h=十进制数对应的ASCII码
从CMOS RAM的8号单元读出的一个字节中,包含了用两个BCD码表示的两位十进制数,高4位的BCD码表示十位,低4位的BCD码表示个位。00010100b表示14。
① 将从CMOS RAM的8号单元中读出的一个字节,分为两个表示BCD码值的数据
mov ah , al   ; al中为从CMOS RAM的8号单元读出的数据
mov cl , 4
shr ah , cl   ; al中为月份的十位数码值
and al , 00001111b     ; al中为月份的个位数码值
② 显示 (ah)+30h 和 (al)+30h 对应的ASCII码字符

assume cs:code
code segment
start:        
        mov al , 8
        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 bx , 0b800h
        mov es , bx
        mov byte ptr es:[160*12+39*2] , ah      ; 显示月份的十位数码
        mov byte ptr es:[160*12+39*2+1] , 01001010b
        mov byte ptr es:[160*12+39*2+2] , al    ; 接着显示月份的个位数码
        mov byte ptr es:[160*12+39*2+3] , 01001010b

        mov ax , 4c00h
        int 21h
code ends
end start

// 编程:以 "年/月/日 时:分:秒" 的格式,显示当前的日期、时间。
assume cs:code
code segment
        d1: db '20YY-MM-DD HH:MM:SS' , '$'  ; 设置待显示格式,YY...后面会用读到的时间数据覆盖
        d2: db 9 , 8 , 7 , 4 , 2 , 0

start:       
        mov ax , cs
        mov ds , ax
        mov si , offset d1+2        ; 这里用到了偏移到标号,就不能把数据放在单独的段中(data segment),ds:data 也不行,只能直接放在code段中
        mov di , offset d2
        mov cx , 6

s1:
        push cx
        mov al , [di]        ; 读取CMOS RAM端口中的时间
        out 70h , al
        in al , 71h

        mov ah , al        ; 转换成数据对应的ASCII码
        mov cl , 4
        shr ah , cl
        and al , 00001111b

        add al , 30h
        add ah , 30h
        mov ds:[si] , ah        ; 放到对应的数据段,覆盖实现占为的字符
        mov ds:[si+1] , al

        add si , 3        ; 偏移
        inc di
        pop cx
        loop s1                ; 循环

        mov ax , 3h        ; 调用中断清屏
        int 10h

        mov ah , 2        ; 调用中断设置光标位置
        mov bh , 0
        mov dh , 12
        mov dl , 30
        int 10h

        mov ax , cs        ; 调用中断显示字符串
        mov ds , ax
        mov dx , 0
        mov ah , 9h
        int 21h

        mov ax , 4c00h
        int 21h
code ends
end start
// 改进,彩色显示
assume cs:code
code segment
        d1: db '20YY-MM-DD HH:MM:SS' , 0
        d2: db 9 , 8 , 7 , 4 , 2 , 0

start:       
        mov ax , cs
        mov ds , ax
        mov si , offset d1+2        
        mov di , offset d2
        mov cx , 6

s1:        push cx
        mov al , [di]        ; 读取CMOS RAM端口中的时间
        out 70h , al
        in al , 71h

        mov ah , al        ; 转换成数据对应的ASCII码
        mov cl , 4
        shr ah , cl
        and al , 00001111b

        add al , 30h
        add ah , 30h
        mov ds:[si] , ah        ; 放到对应的数据段,覆盖实现占为的字符
        mov ds:[si+1] , al

        add si , 3        ; 偏移
        inc di
        pop cx
        loop s1                ; 循

        mov ax , 3h        ; 调用中断清屏
        int 10h

        mov si , offset d1

        mov ah , 2        ; 调用中断设置光标位置
        mov bh , 0        ; 设置显示页码
        mov dh , 12        ; 设置显示位置
        mov dl , 30
        int 10h

s2:        mov ah , 9h        ; 彩色显示字符
        mov al , [si]
        mov bl , 01001010b
        mov cx , 1
        int 10h

        mov ah , 2h        ; 光标偏移
        inc dl
        int 10h

        cmp byte ptr [si] , 0
        je s3
        inc si
        jmp short s2

s3:        mov ax , 4c00h
        int 21h
code ends
end start

assume cs:code ,  ds:data
data segment
        d1 db '20yy-mm-dd hh:mm:ss' , 0            // 这样也可以,不能加冒号
        d2 db 9 , 8 , 7 , 4 , 2 , 0
data ends
code segment
start:      
        mov ax , data
        mov ds , ax
        mov si , offset d1+2       
        mov di , offset d2
        mov cx , 6
        ......
原文地址:https://www.cnblogs.com/meihao1203/p/8023302.html