; 郑重声明:本程序读出并以十六进制形式显示CMOS中的前64个基本信息,然后清零。
; 因此,不会设置CMOS参数者,请不要编译、运行本程序。若因此而造成的任何损失,
; 责任自负。特此声明。
; 因为Windows有保护CMOS信息的功能,所以,在Windows下运行本程序,只能看到显
; 示出来的CMOS基本信息,而看不出被清零的结果;若要看到被清零的结果,请在纯
; DOS下运行本程序。
; 本程序通过编译,运行正确
Code Segment
Assume CS:Code,DS:Code
CR equ 000DH
LF equ 000AH
; -------------------------------------
; 功能:显示指定地址(Str_Addr)的字符串
; 入口:
; Str_Addr=字符串地址(要求在数据段)
; 用法: Output Str_Addr
; 用法举例:Output PromptStr
Output MACRO Str_Addr
lea dx,Str_Addr
mov ah,9
int 21h
EndM
; -------------------------------------
; 功能:输出一个字符
; 入口:dl=要显示的字符
Output_Chr proc Near
push ax
mov ah,02h
int 21h
pop ax
ret
Output_Chr endp
; -------------------------------------
; 功能:输出回车换行
Output_CTLF proc Near
push ax
push dx
mov ah,02h
mov dl,0dh
int 21h
mov dl,0ah
int 21h
pop dx
pop ax
ret
Output_CTLF endp
; -------------------------------------
; Subroutine 延时指定的时钟嘀嗒数
; 入口:
; Didas=时钟嘀嗒数(1秒钟约嘀嗒18.2次,10秒钟嘀嗒182次。若延时不是秒的10数次倍,误差稍微大点)
Delay Proc Near
push dx
push cx
push ax
xor ax,ax
int 1ah
mov Times,dx
mov Times[2],cx
Read_Time: xor ax,ax
int 1ah
sub dx,Times
sbb cx,Times[2]
cmp dx,Didas
jb Read_Time
pop ax
pop cx
pop dx
ret
Times dw 0,0
Delay EndP
; -------------------------------------
; 功能:将AL中的低4位二进制数转换成十六进制显示的ASCII码
; 入口:AL
; 出口:AL=转换后的ASCII码
AL_ASCII Proc Near
cmp al,10 ;AL<10?
jb @@To_ASCII ;AL<10,按数字处理
add al,7 ;AL>=10,按大写字母处理
@@To_ASCII: add al,'0' ;转换成相应的数字或大写字母
ret
AL_ASCII EndP
; -------------------------------------
; 功能:将AL中的字节数据转换成十六进制显示的ASCII码,并在当前光标位置显示
; 入口:AL
; 出口:AX=转换后的ASCII码
Byte_ASCII Proc Near
push dx
push cx
push ax
mov cx,4
xor ah,ah ;将AH置0
shl ax,cl ;将AX左移4位
shr al,cl ;将AL右移4位
xchg ah,al
call AL_ASCII ;调用子程序,将AL中的值转换成相应的ASCII码
xchg ah,al
call AL_ASCII
mov dl,ah
call Output_Chr ;显示一个字符
mov dl,al
call Output_Chr
mov dl,'H'
call Output_Chr
mov dl,20h
call Output_Chr
pop ax
pop cx
pop dx
ret
Byte_ASCII EndP
; -------------------------------------
Didas equ 1 ;写入端口后延时50MS
Prompt_Str db 'CMOS basic information(heximal): ',CR,LF,CR,LF,'$'
Press_Key db 7,13,10,13,10,'Press any key to exit...$'
Start: push cs
pop ds
push cs
pop es ;使数据段、附加段与代码段同段
Output Prompt_Str ;提示显示CMOS内容
mov cx,64 ;CMOS内容字节数
xor al,al ;CMOS内存首地址
mov bl,8 ;每行显示8个字节的CMOS内容
Read_Byte: out 70h,al ;CMOS索引口地址
push ax ;入栈保存CMOS内存当前地址
in al,71h ;CMOS数据口地址
call Byte_ASCII ;将AL中的字节数据转换成十六进制显示的ASCII码,并在当前光标位置显示
pop ax
out 70h,al
push ax
xor al,al
out 71h,al ;清零
pop ax ;出栈恢复CMOS内存当前地址
inc al ;CMOS内存下一个地址
dec bl
jnz $+7
call Output_CTLF ;输出一个回车换行
mov bl,8
call Delay ;延时指定的时钟嘀嗒数
loop Read_Byte ;循环
Exit_Key: Output Press_Key
mov ah,1
int 21h
Exit_Proc: mov ah,4ch ;结束程序
int 21h
Code ENDS
END Start ;编译到此结束
取消
评论