阅读:2248回复:15
救命啊,我只是想在DOS下列举PCI设备信息而已,这样都不行吗?
我想在DOS下列举PCI设备信息,我已经找到了一些代码,可以在win9x下使用。但不能编译为dos运行的程序,如有哪位大哥帮忙。实在不胜感激!!!
谢谢! 程序如下 // PCITest.cpp : Defines the entry point for the console application. // #include \"stdafx.h\" #include \"stdio.h\" #include \"windows.h\" #include \"conio.h\" int main(int argc, char* argv[]) { DWORD IO_CF8,IO_CFC; int i; IO_CF8=0x80000000; //because the first bit is enable/disable for(;;) { _outpd(0xcf8,IO_CF8); IO_CFC=_inpd(0xcfc); if(IO_CFC!=0xffffffff) //if =0xffffffff, then it is a invalid bus number and device number. { printf(\"\\nPCI Device has found, the PCI Config Address=%lx\\n\",IO_CF8); printf(\"Its Bus Number is %lx \\n\",(IO_CF8&0x00ff0000)/0x10000); printf(\"Its Device Number is %lx \\n\",(IO_CF8&0x0000f800)/0x800); printf(\"Its Function Number is %lx \\n\",(IO_CF8&0x700)/0x100); printf(\"This device\'s Device ID and Vendor ID =%lx\\n\",IO_CFC); for(i=0;i<=15;i++) { _outpd(0xcf8,IO_CF8+4*i); //read switch(i) { case 0: printf(\"Device Number and Vendor Number=%lx\"); break; case 1: printf(\"Status and Command=\"); break; case 2: printf(\"Class Code and Revision ID=\"); break; case 3: printf(\"Bist and Header Type and Latency Timer and Cacne Line Size=\"); break; case 4: //PCI Configration has 6 base address; case 5: case 6: case 7: case 8: case 9: printf(\"Base Address Register=\"); break; case 10: case 11: case 13: case 14: printf(\"Reserved=\"); break; case 12: printf(\"Expansion ROM Base Address=\"); break; case 15: //Attention: the interrupt IRQ= this result &0xff printf(\"Max_Let Min_Gnt Interrupt Pin Interrupt line=\"); break; } printf(\"%lx\\n\",_inpd(0xcfc)); } getchar(); } IO_CF8+=0x800; if(IO_CF8>=0x80ffff00) break; } printf(\"Detect Over!\\n\"); return 0; } |
|
|
沙发#
发布于:2002-08-09 21:03
编译通不过?
|
|
|
板凳#
发布于:2002-08-09 21:47
用vc6编译为windows console application 就可以:D
用bc5无法编译 :mad: |
|
|
地板#
发布于:2002-08-09 22:04
windows.h是SDK头文件,DOS下当然用不上了
还有在BC的HELP里查下是否有_outpd和_inpd两个函数,如果没有,修改为相应的函数或自编 其它的是标准C,在DOS下不可能编译通不过的 |
|
地下室#
发布于:2002-08-09 22:06
从程序上看,stdafx.h也用不上啊
|
|
5楼#
发布于:2002-08-09 22:23
谢谢各位:D
实际上windows.h可以不用 把 dword 改为 unsigned long 就可以了 stdafx.h也可以不用 bc是没有_outpd和_inpd两个函数 我自己写了两个 ;myio.asm .model large .code public _inpd _inpd: mov dx,word ptr [esp+4] in eax,dx retf public _outpd _outpd: mov dx,word ptr [esp+4] mov eax,dword ptr [esp+8] out dx,eax retf end ;myio.h extern unsigned long _inpd(unsigned long); extern unsigned long _outpd(unsigned long,unsigned long); 加入myio.h后 bc5说没有tasm.exe 找了一个tasm.exe后 bc5说 eax,esp 什么的没定义,就是不能用32位的寄存器。 |
|
|
6楼#
发布于:2002-08-10 12:30
BC3有inp和outp用的,不知道BC5还有没有。
不认识eax,应该是在设置里面,选386指令。 |
|
7楼#
发布于:2002-08-10 12:46
inp和outp都有
不过我要的是inpd和outpd,就是以双字节访问。 我看了一下BC5的设置,默认的就是386。 我还把linker的16-bit linker的enable 32-bit processing 打开了 还是不行 我在myio.asm前面加上了.386 还是不行 谁能比我惨!!!! |
|
|
8楼#
发布于:2002-08-10 15:03
为什么用BC5 ,不用VC6
|
|
9楼#
发布于:2002-08-10 15:06
VC6可以把它编译成Dos程序吗?如果你知道,请告诉我。
为什么我这么帅,却要掉头发呢?! |
|
|
10楼#
发布于:2002-08-10 15:36
直接在命令行用tasm汇编看看有什么错误提示
|
|
11楼#
发布于:2002-08-12 13:28
用BC3.1吧
写Dos程序当然最好用Dos下的工具 把指令设置为386 把通过汇编器编译也设置上 |
|
|
12楼#
发布于:2002-08-12 13:30
在BC下用嵌入式汇编
|
|
|
13楼#
发布于:2002-08-13 06:23
You can use inline assembly to do that like:
asm { db 0x66 in ax, dx } The above two statements equal to \'in eax, dx\'. You cannot use \'in eax, dx\' in inline assembly in BC31. |
|
|
14楼#
发布于:2002-08-13 08:41
不对吧
asm in eax dx也可以用的 |
|
|
15楼#
发布于:2002-08-13 12:12
可用
|
|