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


    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
            ......
  • 相关阅读:
    Linux入门(四)linux运行环境mysql详细操作及安装phpmyadmin
    Linux入门(五)linux服务器文件远程管理
    Linux入门(六)ubuntu下vim编辑器安装与使用
    windows下9款一键快速搭建PHP本地运行环境的好工具(含php7.0环境)
    Linux入门(三)搭建服务器linux运行环境LAMP/LNMP
    Linux入门(二)Linux基本命令及基本操作
    discuz使用总结
    ThinkPHP3.1快速入门(3)查询语言
    LeetCode 611. 有效三角形的个数(Valid Triangle Number)
    LeetCode 566. 重塑矩阵(Reshape the Matrix)
  • 原文地址:https://www.cnblogs.com/meihao1203/p/8023302.html
Copyright © 2020-2023  润新知