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

    xiaoxiao2025-02-16  18

    代码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

    转载请注明原文地址: https://ju.6miu.com/read-1296511.html
    最新回复(0)