汇编语言(王爽第三版)实验14 访问CMOS RAM

实验14 访问CMOS RAM

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

实验分析:

(1)直接在指令中写字符/和:,让编译器自动查吧。

(2)熟悉CMOS RAM 端口中的那些单元代表的信息。

       秒:0单元     分:2单元       时:4单元   日:7单元        月:8单元       年:9单元

(3)熟练对于端口单元的读出操作。只能使用al或ax。

(4)显示在屏幕什么地方?还是中间吧。书中的程序就不用怎么改动了。

(5)由于要重复6次读出BCD码数据,并转换它们,需要对重复的代码编制成子程序来做。将读出,转换,显示做成一个子程序,调整入口参数即可。

       子程序代码为:

;---

;子程序名称:read_show

;功能:将CMOS RAM中存储的系统时间读取并转换成ASCII码,并显示出来

;入口参数:al(端口单元号)

;返回值:无

;--- 

read_show:

      ;保护寄存器变量,di不用了。

      push ax

      push cx

     

      add di, 6           ;递增3个字(6个字节)用于显示下一个数据。

      ;从CMOS端口读出月份的信息

      ;mov al, 8

      out 70H, al

      in al, 71H

      ;将al中BCD码数据分离为高4位(存储在ah)和低4位(存储在al)

      mov ah, al          ;(al)是读出的BCD数据,复制给ah一份

      mov cl, 4           ;设置移位的位数是4

      shr ah, cl          ;将ah寄存器右移4位,前面4位补0,将高4位(十位)保留

      and al, 00001111b   ;将al寄存器逻辑与,前4位置0,后4位(个位)保留

      ;转换成ASCII码,用于显示

      add ah, 30H

      add al, 30H

      ;显示

      mov byte ptr es:[di], ah        ;显示十位

      mov byte ptr es:[di+2], al      ;显示个位

     

      ;恢复寄存器值

      pop cx

      pop ax

      ret

       子程序分析:基本上按照书中的例子稍微改动了下。注意入口参数就是al,由于di始终参与运算,故不能作为入口参数。也不用保护其值。

       完整的代码如下:

assume cs:code

code segment

start:    mov ax, 0b800H     

      mov es, ax

      mov di, 160*12+30*2         ;设置es:di指向屏幕中间,位置可以调整          

      mov al, 9                   ;入口参数,端口单元:9号(年份)                   

      call read_show              ;调用子程序转换并显示

      mov byte ptr es:[di+4], '/' ;写分隔符

     

      mov al, 8                   ;端口单元:9号(月份)   

      call read_show

      mov byte ptr es:[di+4], '/'

     

      mov al, 7                   ;端口单元:7号(日)

      call read_show

      mov byte ptr es:[di+4], ' '

     

      mov al, 4                   ;端口单元:4号(时)

      call read_show

      mov byte ptr es:[di+4], ':'

     

      mov al, 2                   ;端口单元:2号(分)

      call read_show

      mov byte ptr es:[di+4], ':'

     

      mov al, 0                   ;端口单元:0号(秒)

      call read_show

             

      mov ax, 4c00H

      int 21H

;---

;子程序名称:read_show

;功能:将CMOS RAM中存储的系统时间读取并转换成ASCII码,并显示出来

;入口参数:al(端口单元号),di(显存缓冲区偏址)

;返回值:无

;--- 

read_show:

      ;保护寄存器变量,di不用了。

      push ax

      push cx

     

      add di, 6           ;递增3个字(6个字节)用于显示下一个数据。

     

      out 70H, al

      in al, 71H

      ;将al中BCD码数据分离为高4位(存储在ah)和低4位(存储在al)

      mov ah, al          ;(al)是读出的BCD数据,复制给ah一份

      mov cl, 4           ;设置移位的位数是4

      shr ah, cl          ;将ah寄存器右移4位,前面4位补0,将高4位(十位)保留

      and al, 00001111b   ;将al寄存器逻辑与,前4位置0,后4位(个位)保留

      ;转换成ASCII码,用于显示

      add ah, 30H

      add al, 30H

      ;显示

      mov byte ptr es:[di], ah        ;显示十位

      mov byte ptr es:[di+2], al      ;显示个位

     

      ;恢复寄存器值

      pop cx

      pop ax

      ret

     

code ends

end start

程序结果:

 

程序分析:

【1】将重复大量使用的代码,编制成一个子程序,利于减少代码量,结构化程序。

【2】对于CMOS RAM端口来说,它分为地址端口70H和数据端口71H二个,RAM中不同的单元存储着不同的信息,基本都是机器硬件的配置信息。比较重要。

posted @ 2017-05-21 09:38  筑基2017  阅读(1354)  评论(0编辑  收藏  举报