在Windows下进行底层IO操作之CMOS数据的读取和显示

Windows下进行底层IO操作之CMOS数据的读取和显示

作者:彭学周(Favory.Peng)

 

CPU执行命令一般分为:特权(Privileged-Ring0)和非特权(Non-Privileged Mode-Ring3)两种模式;

Windows系统下的程序都是在Ring3下执行,无法进行任意I/O端口的操作;

要是能让程序在Ring0下执行,自然就可以顺利的进行读写I/O端口的操作;lcsboy编写的WinRing就提供了这个功能,下面以CMOS数据的读取为例介绍WinRing的使用;

编辑环境:BCB 6.0 需要文件:WINRING.sys(端口操作驱动)WinRing.hpp(WinRing应用处理函数)

 

CMOS数据读取原理:

       在计算机系统中,对CMOS中数据的读写是通过两个I/O端口来实现的,其中,端口70H是一个字节的只写端口,用它来设置CMOS中的数据地址;而端口71H是用来读写端口70H设置的CMOS地址中的数据单元字节内容。

//-----------------------------------------------------------------------------------------------------

CMOS代码:

asm{  

mov al, Index    //将需要读取的位置传到AL寄存器

    out 0x70, al        //将读取地址写到70H端口

    in al, 0x71       //71H端口读取数据送AL

    mov Val, al      //AL中的数据送变量Val

}

CMOS代码:

          asm{

            mov al, Index      //将需要写入的地址送AL

            out 0x70, al        //AL中的地址写入70H端口

            mov al, Val        //将需要写入的值送到AL

            out 0x71, al               //将值写入71H端口完成数据写操作

}

//-----------------------------------------------------------------------------------------------------

1、在程序段加入WinRing.hpp的引用:#include "WinRing.hpp"

2、在窗口程序FormCreate事件中加入:OpenWinRing();

3、在窗口程序FormCloseQuery事件中加入:CloseWinRing();

4、编写CMOS读写函数:(要求代码精简,不能有控件操作等)

BYTE CMOSData[128];  //存储CMOS数据

void __fastcall TForm1::ReadComs(void)  //CMOS数据

{

        BYTE Val, Index;

        asm cli;  //关中断

        for (int i=0;i<128; i++)

        {

          Index=i;

          asm{

            mov al, Index

            out 0x70, al

            in al, 0x71

            mov Val, al}

            CMOSData[i]=Val;

        }

        asm sti;  //开中断

}

//---------------------------------------------------------------------------

void __fastcall  TForm1::WriteComs(void)

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值