zoukankan      html  css  js  c++  java
  • 汇编实验14:访问CMOS RAM

    汇编实验14:访问CMOS RAM

    任务

    编程,以“年/月/日 时:分:秒”的格式,显示当前的日期,时间。

    预备知识

    CMOS存储当前时间的信息:年、月、日、时、分、秒。这六个信息的长度均为1个字节,并且以BCD码的形式存放(什么是BCD码?这里就不科普了,自行百度,反正我也只是略懂),存放的单元如下表所示:

    0 2 4 7 8 9

    那么怎么访问CMOS的端口呢?这就要用到inout指令。另外要注意的是,这两条指令只能用寄存器AX和AL发送和接收端口的数据。
    也就是只能用in ax/al,端口号读入数据,只能用out 端口号,ax/al写数据,当然,这里的端口号既可以放在寄存器里,也可以凡在内存单元里,也可以是立即数,这无所谓。

    CMOS芯片内部有两个端口,地址分别为70h与71h。

    • 70h为地址端口,存放要访问的CMOS单元地址
    • 71为数据端口,存放读写数据

    要读取CMOS的2号单元,应该这么写

        mov     al,2
        out     70h,al     ;将2送入端口70h中
        in      al,71h      ;从端口71h读取2号单元的内容

    要将“0”写入CMOS的2号单元,应该这么写

        mov     al,2
        out     70h,al      ;将2送入端口70h
        mov     al,0
        out     71h,al      ;从端口71h写入0放到2号单元

    编程思路

    有了前面知识的铺垫,编程就变得相当简单。

    在数据段先定义好输出格式

     time db '00/00/00 00:00:00$'

    后面为什么加了个$符号呢?那是为了调用dos中断,用int 21h的9号功能输出字符串(没错,我就是这么懒,不想自己造轮子)。
    接下来要从CMOS中读取时间信息,并且存放到数据段中去了。
    显然这里要用到循环结构,为了方便,我还要定义一个地址表,给出各个时间信息的存放单元

    list    db 9,8,7,4,2,1
    ;分别为年、月、日、时、分、秒的单元地址

    用寄存器DI指向time字符串,用寄存器SI指向list地址表。每次循环调整时,
    只要inc siadd di,3即可。

    循环的核心部分思路,王爽的书中已经给出详细代码,就不在赘述(好吧,我就是懒)。这里有一点要注意的是,由于循环体中用到了CX寄存器,因此使用loop指令要注意寄存器CX的保护。其次,对于时间信息来说(这里以年为例子),‘16’年中数字16中的十位数字“ 1 ”在存储单元低地址位置,而个位数字“ 6 ”在存储单元高地址位置,因此我在实现的过程中,将数字“1”的ascii码放在寄存器AL中,将数字“6”的ascii码放在寄存器AH中,然后将寄存器AX整体复制到time字符串中。当然中间将BCD码转换成ASCII码的实现,在王爽的书里已经有了,就不贴出来了。

    代码实现

    其实这次实验很简单,代码也简单明了,一看就懂,没必要写注释了(偷懒偷得理直气壮,笑)

    assume      cs:code,ds:data,ss:stack
    
    data        segment
        time    db  '00/00/00 00:00:00$'
        list    db  9,8,7,4,2,0     
    data        ends
    
    stack       segment
        db  256 dup(0)
    stack       ends
    
    code        segment
    
    main:       mov     ax,data
                mov     ds,ax
                mov     ax,stack
                mov     ss,ax
                mov     sp,256
    
    
                mov     si,offset list
                mov     di,offset time
                mov     cx,6
        s:      push    cx
                mov     al,[si]
                out     70h,al
                in      al,71h
    
                mov     ah,al
                mov     cl,4
                shr     al,cl
                and     ah,00001111b
                add     ax,3030h
    
                mov     [di],ax
    
                add     di,3
                inc     si
                pop     cx
                loop    s
    
                mov     ah,9
                mov     dx,offset time
                int     21h         
    
                mov     ax,4c00h
                int     21h
    
    code        ends
    
    end     main

    最后的效果是这样的:

    这里写图片描述

    总结

    这篇博文本来我早就想发的,但是因为种种原因,拖到现在才发(我发誓,这次真的不是因为懒)。王爽的《汇编语言(第三版)》马上就要读完了,感觉自己慢慢开始入门了,找到了点汇编的门道,虽然前面的路还很长(32位汇编,实模式,保护模式,AT&T,inte,IA32,以上名词本人一无所知),但我还是有信心可以成为“牛人”的。读完这本书以后,我就要开始数据结构和算法的学习了,业余时间我还想读一读《深入理解计算机系统》(CSAPP),我听说学校有一门课的教材就是这本书,这老师是要把学生培养成“牛人”,然后上天的节奏啊!!!不过这个过程还是很幸苦的。(只要你成为牛人,那么即使成为书呆子也无所谓啦

  • 相关阅读:
    matlab中plot画图参数的设置
    TOF相机基本知识
    工业相机接口选择
    工业相机基本知识
    TwinCAT 3中基于UDP协议通讯的C++实现
    投影几何中的无穷远量
    基于CANopen DSP402的运动控制笔记
    C++ new 的用法
    C++中static用法总结
    设计模式——适配器模式(Adapter Pattern)
  • 原文地址:https://www.cnblogs.com/wyf12138/p/6581525.html
Copyright © 2011-2022 走看看