您的位置:首页 > 其它

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

2016-08-13 23:55 302 查看
代码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码转变成2个byte的ASCII码
;参数:(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,
          ;(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码转变成2个byte的ASCII码
;参数:(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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: