- [游客] 懂了,太有技巧了,又找到编程方向了,多谢楼主! 10/20 22:50
- [游客] 有帮助,谢了:) 10/29 11:28
- [游客] 解释的和详细啊 09/20 20:39
- [游客] 非常的详细,基本新手一看也就能了解到了。。其中还讲了PSP占用256字节,用实际情况巩固了前面的知识 12/27 22:35
- [游客] 分析的很……很细!鼓励 09/21 11:21
- [vvfire] 学习了 04/12 22:14
- [c_losed] 第3题 mov cx,23 08/07 23:35
- [游客] 多谢楼主,以后还请多多指教 05/03 22:23
- [游客] 非常仔细!分析得非常到位! 11/30 11:52
- [maxm] 我先收藏 03/22 17:52
- [skyleiou] 谢谢你的鼓励,你的鼓励也让我看到了现在网站里还有人~~~ 06/14 20:12
- [hihi] 不好意思,最近有事没来。刚去看了一下,已经有人回答了 04/22 09:40
- [w0922] 你好 !能不能到我的博客看哈 有个问题想请教哈你··· 就是我博客实验十分析的那个问题 04/18 15:19
[2008-04-13 17:27] 实验14 访问CMOS ROM
简单分析:
在CMOS ROM中存放有:
秒:0 分:2 时:4 日:7 月:8 年:9
看到这个就有点郁闷了,想找点规律一个循环搞定,结果发现没那能力。有6个数据,一个一个处理,又点不甘心。
两难之下,决定分两次处理(总算有一点规律):
先处理年月日,再处理时分秒。
两部分都使用到了子程序:changeBCD
显示部分,本来可以自己处理的,但考虑到以前已经写过几次了,直接调用中断得了。
;---------------------------------代码如下----------------------------------------------
assume cs:code,ds:data
data segment
db 32 dup ('$')
data ends
code segment
start:
mov ax,data
mov ds,ax
mov si,0
mov bl,9 ;处理年月日
mov cx,3
ymd:
call changeBCD
dec bl
loop ymd
mov bl,4 ;处理时分秒
mov cx,3
hms:
call changeBCD
add bl,2
loop hms
;------------------------------加入分隔符--------------------------------------------------
mov si,2 ;输入“/”
mov byte ptr [si],'/'
add si,3
mov byte ptr [si],'/'
add si,3 ;输入“ ”
mov byte ptr [si],' '
add si,3 ;输入“ :”
mov byte ptr [si],':'
add si,3
mov byte ptr [si],':'
;----------------------调用10h号中断,设置光标--------------------------------------------
mov ah,2
mov bh,0
mov dh,12
mov dl,20
int 10h
;----------------------调用21h中断,显示字符串-------------------------------------------
mov dx,0
mov ah,9
int 21h
mov ax,4c00h
int 21h
;---------------------子程序: changeBCD----------------------------------------------------
;子程序: changeBCD
;功能: 从CMOS ROM读取BCD码,并转化为十进制字符。
;参数: CMOS ROM的(bl)号单元
;返回: 返回一个字符串,首地址为ds:si
changeBCD:
push cx
mov al,bl
out 70h,al
in al,71h
mov ah,al
mov cl,4
shr ah,cl
and al,00001111b
add ah,30h
add al,30h
mov [si],ah
mov [si+1],al
add si,3
pop cx
ret
code ends
end start
;---------------------------------结果见上图---------------------------------------------
在CMOS ROM中存放有:
秒:0 分:2 时:4 日:7 月:8 年:9
看到这个就有点郁闷了,想找点规律一个循环搞定,结果发现没那能力。有6个数据,一个一个处理,又点不甘心。
两难之下,决定分两次处理(总算有一点规律):
先处理年月日,再处理时分秒。
两部分都使用到了子程序:changeBCD
显示部分,本来可以自己处理的,但考虑到以前已经写过几次了,直接调用中断得了。
;---------------------------------代码如下----------------------------------------------
assume cs:code,ds:data
data segment
db 32 dup ('$')
data ends
code segment
start:
mov ax,data
mov ds,ax
mov si,0
mov bl,9 ;处理年月日
mov cx,3
ymd:
call changeBCD
dec bl
loop ymd
mov bl,4 ;处理时分秒
mov cx,3
hms:
call changeBCD
add bl,2
loop hms
;------------------------------加入分隔符--------------------------------------------------
mov si,2 ;输入“/”
mov byte ptr [si],'/'
add si,3
mov byte ptr [si],'/'
add si,3 ;输入“ ”
mov byte ptr [si],' '
add si,3 ;输入“ :”
mov byte ptr [si],':'
add si,3
mov byte ptr [si],':'
;----------------------调用10h号中断,设置光标--------------------------------------------
mov ah,2
mov bh,0
mov dh,12
mov dl,20
int 10h
;----------------------调用21h中断,显示字符串-------------------------------------------
mov dx,0
mov ah,9
int 21h
mov ax,4c00h
int 21h
;---------------------子程序: changeBCD----------------------------------------------------
;子程序: changeBCD
;功能: 从CMOS ROM读取BCD码,并转化为十进制字符。
;参数: CMOS ROM的(bl)号单元
;返回: 返回一个字符串,首地址为ds:si
changeBCD:
push cx
mov al,bl
out 70h,al
in al,71h
mov ah,al
mov cl,4
shr ah,cl
and al,00001111b
add ah,30h
add al,30h
mov [si],ah
mov [si+1],al
add si,3
pop cx
ret
code ends
end start
;---------------------------------结果见上图---------------------------------------------
评论次数(1) |
浏览次数(1138) |
类型(汇编作业) |
收藏此文 |