⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pcis_io.cpp

📁 在DOS下用Port IO的方式取得PCI总线的信息
💻 CPP
字号:
#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("\nBus# = %x\n", bus);
		printf("Device # = %x\n", device);
		printf("ID#  = %lx\n", iod);
		for (io=0; io<=5; io++)
		{
		    ioa0 = iobase + 0x10 + io*4;
		    _outpd(0xcf8, ioa0);
		    iod = _inpd(0xcfc);
		    printf("Base%d = 0x%lx\n", io, iod);
		}

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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -