📄 pcis_io.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 + -