王爽《汇编语言》实验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,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
;==========================================================================
;编程,以"年/月/日
时:分:秒"的格式,显示当前的日期、时间.
;==========================================================================
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
相关文章推荐
- 王爽《汇编语言》实验14:访问CMOS RAM打印日期和时间 解答
- 汇编语言(王爽)--实验14 访问CMOS RAM
- 王爽 汇编语言 第三版 实验14 访问 CMOS RAM
- 王爽《汇编语言》第十四章实验——访问CMOS RAM
- 王爽 《汇编语言》 实验14 利用CMOS RAM 显示时间
- 《汇编语言(王爽)》(第八章、实验7寻址方式在结构化数据访问中的应用)学习笔记
- 汇编语言 实验14 访问CMOS RAM
- 汇编实验14:访问CMOS RAM
- 王爽《汇编语言》实验7:结构化数据访问
- 实验14:访问CMOS RAM显示当前日期和时间
- 王爽<汇编语言>实验14 访问CMOS RAM 解答(详细注释)
- 王爽《汇编语言》第十四章实验14
- 王爽《汇编语言》实验7:结构化数据访问 解答
- 王爽汇编 实验14读取CMOS RAM时间信息
- 王爽 汇编语言 第二版 实验七 寻址方式在结构化数据访问中的使用 源码
- 王爽《汇编语言》第八章实验七 题目分析解答
- 汇编语言(王爽)第六章检测点与实验5
- 汇编语言(王爽)-实验9
- 王爽 《汇编语言》 实验16 将含有直接定址表的程序,安装到中断上
- 王爽《汇编语言》(第3版) 实验七