九天雁翎的博客
如果你想在软件业获得成功,就使用你知道的最强大的语言,用它解决你知道的最难的问题,并且等待竞争对手的经理做出自甘平庸的选择。 -- Paul Graham

用汇编保存下CMOS内容后的不解(附源码),信息到底在哪里?

公开的I/O接口,70h,71h,甚至72h,73h我也试过,结果内容和70h,71h一样,在我改动BIOS设置后,发现两次的文件没有什么变化(时间变化除外),按国外的CMOS Memory Map ,应该每个时间位后面跟一个Alarm时间位,事实上我打开前后,此位一直为零,是不是一旦开机,BIOS自动为此位清零?目前具体的东西不太清除,还不该尝试在这些Alarm位上写东西,因为我测试过两台电脑,都是AMI的BIOS,在BIOS中打开Alarm后没有发现如期的改动。请高人指点。

以下为我保存CMOS信息的源代码,大家可以放心尝试一下,假如你的结果和我说的不一样,请告诉我,比如在改动BIOS中Alarm后,生成的文件中各时间位后是否真的有响应变化。

assume cs:code,ds:data;,ss:stack

;stack segment stack
;        db 2 dup(?)
;stack ends

data segment
         biosdata db 126 dup(?)
         filename db 'NowBios.txt',0
         strcantcreate  db 'Why can not create a file?','$'
         strcantclose     db 'Why can not close a file?','$'
         strcantwrite    db 'Why can not write the file?','$'
        
data ends

code segment
start:               mov ax,data
                   mov ds,ax;以上两句确定数据段ds
                   mov cx,7Dh;此句确定readbios循环次数
                   mov bx,offset biosdata;确定写入的地点
                   mov al,0;从端口此位置开始读

readbios: out 70h,al;写入要从71h开始读的地址
                   mov ah,al;保存al
                   mov al,0
                   in  al,71h;从端口71h(bios CMOS端口)读数据
                   mov ds:[bx],al;保存在地址段
                   mov al,ah;恢复al
                   inc al
                   inc bx;al++,bx++下一次读下一个
                   loop readbios


                   mov dx,offset filename;确定创建的文件名
                   mov cx,0
                   mov ah,3ch; 定义接口,创建文件
                   stc;置CF位标志以确定以下中断成功进行
                   int 21h
                   jc errcantcreate;创建失败就输出错误信息

                   mov dx,offset biosdata;确定写入文件的信息从哪个地址开始
                   mov bx,ax;保存文件句柄
                   mov cx,7Dh;确定写入多少数据
                   stc;置CF位标志以确定以下中断成功进行
                   mov ah,40h;将数据段的内容写入文件
                   int 21h
                   jc errcantwrite

                   mov ah,3eh;关闭文件
                   int 21h
                   jc errcantclose
                   jmp theend

errcantcreate:          mov dx,offset strcantcreate
                   mov ah,9
                   int 21h
                   jmp theend

errcantclose:   mov dx,offset strcantclose
                   mov ah,9
                   int 21h
                   jmp theend

errcantwrite:   mov dx,offset strcantwrite
                   mov ah,9
                   int 21h
                   jmp theend

theend:             mov ax,4c00h
                   int 21h

code ends
end start

不想编译的可以下载以下网址编译好的程序

http://disk24.sh.com/?vagr

http://groups.google.com/group/jiutianfile/files

最后生成的是16位的文件,通过UltraEdit查看就可以了,具体应该的含义可以参考CMOS Memory Map,希望你能告诉我你的电脑是否符合上述CMOS Memory Map。谢了

分类:  汇编和反汇编 
标签:  汇编和反汇编 

Posted By 九天雁翎 at 九天雁翎的博客 on 2008年03月04日

前一篇: 关于使用汇编所想到的……IT公司企业文化和实力的问题,看看它的技术支持就可见一斑 后一篇: Effective C++ 第3版 Item 26详尽研究 个人认为最后一些内容有待商酌