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

代码1:

;==========================================================================

;编程,"// ::"的格式,显示当前的日期、时间.

;==========================================================================

ASSUME CS:CODE

 

DATA SEGMENT

    ;定义日期的字符串,"$"结尾

    DATE DB "  / /     :  : ",'$'

   

DATA ENDS

 

CODE SEGMENT

START:

    MOV AX,DATA         ;初始化DS

    MOV DS,AX

   

    ;读取秒,放置到日期字符串秒的位置

    MOV AL,0H           ;CMOS ROM 0号单元

    OUT 70H,AL          ;向端口70H写入要访问的单元的地址

    IN AL,71H           ;从端口71H获得要写入AL的数据

    CALL BCD2ASCII;BCD码转化为数字的ASCII,(AH)=十位的ASCII,(AL)=个位的ASCII

    MOV SI,15           ;SI指向日期字符串秒的位置

    MOV BYTE PTR [SI],AH    ;传送

    MOV BYTE PTR [SI+1],AL

   

    ;读取分,放置到日期字符串分的位置

    MOV AL,2H

    OUT 70H,AL

    IN AL,71H

    CALL BCD2ASCII

    MOV SI,12 

    MOV BYTE PTR [SI],AH

    MOV BYTE PTR [SI+1],AL

   

    ;读取时,放置到日期字符串时的位置

    MOV AL,4H

    OUT 70H,AL

    IN AL,71H

    CALL BCD2ASCII

    MOV SI,9 

    MOV BYTE PTR [SI],AH

    MOV BYTE PTR [SI+1],AL

   

    ;读取日,放置到日期字符串日的位置

    MOV AL,7H

    OUT 70H,AL

    IN AL,71H

    CALL BCD2ASCII

    MOV SI,6 

    MOV BYTE PTR [SI],AH

    MOV BYTE PTR [SI+1],AL 

 

    ;读取月,放置到日期字符串月的位置

    MOV AL,8H 

    OUT 70H,AL

    IN AL,71H

    CALL BCD2ASCII

    MOV SI,3 

    MOV BYTE PTR [SI],AH

    MOV BYTE PTR [SI+1],AL 

   

    ;读取年,放置到日期字符串年的位置

    MOV AL,9H

    OUT 70H,AL

    IN AL,71H

    CALL BCD2ASCII

    MOV SI,0 

    MOV BYTE PTR [SI],AH

    MOV BYTE PTR [SI+1],AL

   

    ;显示日期字符串,DS:DX指向字符串首地址

    MOV DX,0

    MOV AH,9

    INT 21H

 

    MOV AX,4C00H

    INT 21H

 

;----------------------------------------------------------------------------  

;功能:把一个byte、两位数的BCD码转变成2byteASCII

;参数:(AL)=十进制两位数的BCD(十位=4位的BCD,个位=4位的BCD)

;返回:(AH)=十位的ASCII,(AL)=个位的ASCII 

BCD2ASCII PROC NEAR

    PUSH CX     ;保存用到的寄存器

    MOV AH,AL       ;AL中的BCD码复制一份到AH

    MOV CL,4        ;右移4,取得月份十位的值

    SHR AH,CL       ;(AH)=月份十位的值

    AND AL,00001111B;(AL)=月份个位的值

    ADD AH,30H      ;(AH)=月份十位的ASCII

    ADD AL,30H      ;(AL)=月份个位的ASCII

    POP CX          ;恢复用到的寄存器

    RET         ;返回

BCD2ASCII ENDP

;----------------------------------------------------------------------------  

   

CODE ENDS

END START



代码2:

;==========================================================================

;编程,"// ::"的格式,显示当前的日期、时间.

;==========================================================================

ASSUME CS:CODE

 

DATA SEGMENT

    ;定义日期的字符串,"$"结尾

    DATE DB "  / /     :  : ",'$'

    DATE_POS DB 0,2,4,7,8,9

    DATE_CHAR_POS DB 15,12,9,6,3,0

DATA ENDS

 

CODE SEGMENT

START:

    MOV AX,DATA         ;初始化DS

    MOV DS,AX

   

    MOV CX,6            ;循环次数=6

    MOV DI,OFFSET DATE_POS ;DI用来定位需要读取的CMOS ROM的单元

    MOV BX,OFFSET DATE_CHAR_POS  ;BX用来定位日期各项的位置

    SHOW_DATE:

    PUSH CX         ;保存循环次数

    ;读取日期的一项,放置到日期字符串相应的位置

    MOV AL,[DI]     ;CMOS ROM 日期的某单元

    OUT 70H,AL          ;向端口70H写入要访问的单元的地址

    IN AL,71H           ;从端口71H获得要写入AL的数据

    CALL BCD2ASCII;BCD码转化为数字的ASCII,(AH)=十位的ASCII,(AL)=个位的ASCII

    PUSH AX         ;压入(AX),因为后面还要传送到DATE,而紧接着改变了(AX)

    MOV AX,[BX]     ;(AX)=日期某项的位置

    MOV AH,0            ;(AH)置零

    MOV SI,AX           ;SI指向日期字符串某项的位置

    POP AX              ;恢复(AX)

    MOV BYTE PTR [SI],AH    ;传送

    MOV BYTE PTR [SI+1],AL

    INC DI              ;DI+1,定位到下一个单元        

    INC BX              ;BX+1,定位到DATE字符串下一个位置

    POP CX              ;恢复循环次数

    LOOP SHOW_DATE      ;继续传送日期的下一项到DATE

   

    ;显示日期字符串,DS:DX指向字符串首地址

    MOV DX,0

    MOV AH,9

    INT 21H

 

    MOV AX,4C00H

    INT 21H

 

;----------------------------------------------------------------------------  

;功能:把一个byte、两位数的BCD码转变成2byteASCII

;参数:(AL)=十进制两位数的BCD(十位=4位的BCD,个位=4位的BCD)

;返回:(AH)=十位的ASCII,(AL)=个位的ASCII 

BCD2ASCII PROC NEAR

    PUSH CX     ;保存用到的寄存器

    MOV AH,AL       ;AL中的BCD码复制一份到AH

    MOV CL,4        ;右移4,取得月份十位的值

    SHR AH,CL       ;(AH)=月份十位的值

    AND AL,00001111B;(AL)=月份个位的值

    ADD AH,30H      ;(AH)=月份十位的ASCII

    ADD AL,30H      ;(AL)=月份个位的ASCII

    POP CX          ;恢复用到的寄存器

    RET         ;返回

BCD2ASCII ENDP

;----------------------------------------------------------------------------  

   

CODE ENDS

END START

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值