[汇编]《汇编语言》第四版实验14 访问CMOS RAM

这篇博客展示了如何通过编写子程序实现循环打印当前时间,简化代码并提高代码的可读性。作者利用汇编语言,定义了数据段和代码段,通过读取CMOSRAM获取时间,并将其转换为十进制数码,再利用打印子程序进行显示。整个过程体现了代码的优雅和效率。
摘要由CSDN通过智能技术生成
;显示当前时间
assume cs:code,ds:data
data segment
    db '024789'
    db '// :: '
data ends

code segment
    start:          mov     ax,data
                    mov     ds,ax
                    mov     bx,0
                    mov     cx,6
    s:              mov     al,ds:[bx]
                    sub     al,'0'
                    call    cal
                    push    ax
                    inc     bx
                    loop    s

                    mov     ax,ds
                    mov     es,ax
                    mov     dh,24 ;行
                    mov     dl,0  ;列
                    mov     cx,6  ;循环次数
    s1:             pop     ax
                    push    cx
                    mov     ch,2    ;颜色
                    mov     cl,ah   ;先输出十位
                    call    print
                    inc     dl
                    mov     cl,al   ;再输出个位
                    call    print
                    inc     dl
                    mov     cl,es:[bx]  ;再输出连接符
                    call    print
                    inc     bx
                    inc     dl
                    pop     cx
                    loop    s1

                    mov     ax,4c00h
                    int     21h
    ;从CMOS RAM中读取一个字节的数据,然后转换为十进制数码
    ;参数:al 读取的单元地址
    ;返回值:ax 为转换后的十进制数码(两位数,高地址表示十位,低地址表示个位)
    cal:            push    cx
    calstart:       out     70h,al
                    in      al,71h

                    mov     ah,al
                    mov     cl,4
                    shr     ah,cl
                    and     al,00001111b

                    add     al,30h
                    add     ah,30h
    calend:         pop     cx
                    ret
    ;显示一个字符
    ;参数: (dh)=行号[0,24] (dl)=列号[0,79] (ch)=颜色 (cl)=字符
    ;返回值:无
    print:          push    cx
                    push    ax
                    push    es
                    push    bx
    printstart:     mov     ax,0b800h
                    mov     es,ax
                    mov     al,dh
                    mov     ah,0A0h
                    mul     ah
                    mov     bx,ax
                    mov     al,dl
                    mov     ah,2
                    mul     ah
                    add     bx,ax
                    mov     es:[bx],cx
    printend:       pop     bx          ;恢复外界寄存器值
                    pop     es
                    pop     ax
                    pop     cx
                    ret
code ends

end start

在这里插入图片描述

因为懒,所以弄了几个子程序来方便调用,然后不想一个一个手输打印,于是弄循环来打印,感觉还挺优雅的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值