DOS下BC编译的遍历PCI总线查询PCI设备及基地址

本文介绍了如何在DOS环境下使用BC编译器遍历PCI总线,查询并获取PCI设备的基地址。通过学习,可以理解在DOS下进行底层硬件交互的技术细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PCI设备查询:

#include <stdio.h>
#include 
<conio.h>

typedef unsigned 
long DWORD ;

static DWORD _inpd(int portnum)
{
    
static DWORD value ;
    asm mov dx,portnum ;
    asm lea bx,value ;
    
#if defined(__BORLANDC__)
    __emit__(
0x66,0x50,        // push EAX
         0x66,0xED,        // in EAX,DX
         0x66,0x89,0x07,    // mov [BX],EAX
         0x66,0x58) ;        // pop EAX
    #else
    asm push eax
    asm 
in eax,dx ;
    asm mov [bx],eax ;
    asm pop eax
    
#endif
    
return value ;
}


static void _outpd(int portnum, DWORD val)
{
    
static DWORD value = 0 ;

    value 
= val ;
    asm mov dx,portnum ;
    asm lea bx,value ;
    
#if defined(__BORLANDC__)
    __emit__(
0x66,0x50,        // push EAX
         0x66,0x8B,0x07,    // mov EAX,[BX]
         0x66,0xEF,        // out DX,EAX
         0x66,0x58) ;        // pop EAX
    #else
    asm push eax
    asm mov eax,[bx] ;
    asm 
out dx,eax ;
    asm pop eax
    
#endif
    
return ;
}


void main(void)
{
    
int i, j, k;
    
int bus, device;
    unsigned 
long ioa0, iod;
    unsigned 
long iobase;
    
int io;

    clrscr();
    
for(i=0; i<5; i++)
    
{
    
for(j=0; j<32; j++)
    
{
        bus 
= i;
        device 
= j;
        iobase 
= 0x80000000 + bus * 0x10000+ (device * 8 ) * 0x100;
        ioa0 
= iobase + 0;
        _outpd(
0xcf8, ioa0);
        iod 
= _inpd(0xcfc);
        
if (iod != 0xffffffff)
        
{
        printf(
" Bus# = %x ", bus);
        printf(
"Device # = %x ", device);
        printf(
"ID#  = %lx ", iod);
        
for (io=0; io<=5; io++)
        
{
            ioa0 
= iobase + 0x10 + io*4;
            _outpd(
0xcf8, ioa0);
            iod 
= _inpd(0xcfc);
            printf(
"Base%d = 0x%lx ", io, iod);
        }


        ioa0 
= iobase + 0x3c;
        _outpd(
0xcf8, ioa0);
        iod 
= _inpd(0xcfc);
        printf(
"IRQ#  = 0x%x ", iod & 0xff);
        getch();
        }

    }

    }

}

 

DOS下BC编译的遍历PCI总线查询PCI设备及基地址。

“Grant”老大就是老大,我差的还远,努力学习中......

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值