王爽汇编 实验14读取CMOS RAM时间信息

来源:互联网 发布:西安牛小网络 编辑:程序博客网 时间:2024/05/17 08:13

ASSUME    CS:codesg
              data SEGMENT
              DB        "/",":"
              data ENDS
              stack SEGMENT
              DW        0,0
              stack ENDS
              codesg SEGMENT
           start:   MOV       AX,data
                       MOV       DS,AX
                       MOV       SI,0
                       MOV       AX,stack
                       MOV       SS,AX
                       MOV       SP,4
                       MOV       AX,0b800h
                       MOV       ES,AX

                       MOV       DI,12*160+30*2          ;取屏幕中间位置
             
                       MOV       BX,0
                       MOV       DL,9
                       MOV       CX,3
               NYR: PUSH      CX
                       MOV       AL,DL
                       OUT       70h,AL
                       IN        AL,71h
                       MOV       AH,AL          ;假设al中为读出的8位BCD码
                       MOV       CL,4
                       SHR       AH,CL          ;ah右移4位,便移除了个位的BCD码
                       ADD       AH,30h
                       AND       AL,00001111b   ;al保留下来的便是个位BCD码
                       ADD       AL,30h
                       MOV       ES:[DI+BX],AH
                       MOV       ES:[DI+BX+2],AL
                       MOV       AL,DS:[SI]
                       MOV       ES:[DI+BX+4],AL
                       ADD       BX,6
                       DEC       DL
                       POP       CX
                       LOOP      NYR            ;取得年月日
                     
                       MOV       BYTE PTR ES:[DI+16],0  ;去掉日后面的“/”
                      
                       ADD       BX,2           ;中间空格
                       MOV       DL,4
                       MOV       CX,3
              MFS: PUSH      CX
                       MOV       AL,DL
                       OUT       70h,AL
                       IN        AL,71h
                       MOV       AH,AL          ;假设al中为读出的8位BCD码
                       MOV       CL,4
                       SHR       AH,CL          ;ah右移4位,便移除了个位的BCD码
                       ADD       AH,30h
                       AND       AL,00001111b   ;al保留下来的便是个位BCD码
                       ADD       AL,30h
                       MOV       ES:[DI+BX],AH
                       MOV       ES:[DI+BX+2],AL
                       MOV       AL,DS:[SI+1]
                       MOV       ES:[DI+BX+4],AL
                       ADD       BX,6
                       SUB       DL,2
                       POP       CX
                       LOOP      MFS            ;取得秒分时
                  
                       MOV       BYTE PTR ES:[DI+36],0  ;去掉秒后面的“:”

                       JMP       s                  ;实时读取时间                      

                       MOV       AX,4c00h
                       INT       21h
                      
              codesg ENDS
              END       start