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”老大就是老大,我差的还远,努力学习中......