代码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,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码转变成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