王爽《汇编语言》实验14:访问CMOS RAM

编程,以“年/月/日 时:分:秒”的格式打印当前时间

代码如下:

assume cs:codesg
datasg segment
str:db '0123/56/89 bc:ef:gh$'
s_p:dw 0,2,5,8,0bh,0eh,11h  ;用来指向str中打印时间的位置
c_p:dw 32h,9,8,7,4,2,0      ;用来指向CMOSRAM中时间信息的位置
datasg ends                 ;CMOSRAM中32h地址存储着纪年信息(年份/100)
                            ;记录c_p和s_p的目的是为了在一个循环中完成所有时间信息的处理
codesg segment              ;c_p和s_p的内容相当于指针
start:
    mov ax,datasg
    mov ds,ax
    xor dx,dx           ;ds:dx->字符串,为调用21h中断9功能做准备

    mov si,offset s_p
    mov di,offset c_p

    mov cx,7            ;纪年、年、月、日、时、分、秒共7次           
s:  mov ax,ds:[di]      ;ds:di->c_p中保存着时间信息在CMOSRAM中的地址,相当于指针的指针
    out 70h,al          ;将从c_p中取出的地址送入70h端口
    in al,71h           ;将时间信息取出到(al)
    call bcd_to_dec     
    add ah,30h          
    add al,30h          ;将数字转换为字符
    mov bx,ds:[si]      ;ds:si->s_p中保存着str中需要被时间信息填充的地址
    mov ds:[bx],ah      
    mov ds:[bx+1],al    ;每个时间信息均为两位数(0-99)
    add di,2            ;ds:di->c_p下一个时间信息在CMOSRAM中的地址
    add si,2            ;ds:si->s_p下一个需要被时间信息填充的地址
    loop s

    mov ah,9            ;9功能
    int 21h             

    mov ax,4c00h
    int 21h

bcd_to_dec:             ;将(al)z中BCD码转换为十进制码,转化后保存到(ah)(al)
    push cx
    mov ah,al
    mov cl,4
    shr ah,cl
    and al,00001111B
    pop cx
    ret
codesg ends
end start

运行截图:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值