bodies
驱动牛犊
驱动牛犊
  • 注册日期2002-04-11
  • 最后登录2010-07-12
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望20点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2248回复:15

救命啊,我只是想在DOS下列举PCI设备信息而已,这样都不行吗?

楼主#
更多 发布于:2002-08-09 20:56
我想在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;
}
用程序表达思想
denizen
驱动大牛
驱动大牛
  • 注册日期2001-12-30
  • 最后登录2012-05-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-08-09 21:03
编译通不过?
Where there is a will, there is a road.
bodies
驱动牛犊
驱动牛犊
  • 注册日期2002-04-11
  • 最后登录2010-07-12
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望20点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-08-09 21:47
用vc6编译为windows console application 就可以:D
用bc5无法编译
 :mad:
用程序表达思想
chnh
驱动小牛
驱动小牛
  • 注册日期2002-04-09
  • 最后登录2004-02-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-08-09 22:04
windows.h是SDK头文件,DOS下当然用不上了
还有在BC的HELP里查下是否有_outpd和_inpd两个函数,如果没有,修改为相应的函数或自编
其它的是标准C,在DOS下不可能编译通不过的
chnh
驱动小牛
驱动小牛
  • 注册日期2002-04-09
  • 最后登录2004-02-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-08-09 22:06
从程序上看,stdafx.h也用不上啊
bodies
驱动牛犊
驱动牛犊
  • 注册日期2002-04-11
  • 最后登录2010-07-12
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望20点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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位的寄存器。
用程序表达思想
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2002-08-10 12:30
BC3有inp和outp用的,不知道BC5还有没有。
不认识eax,应该是在设置里面,选386指令。
bodies
驱动牛犊
驱动牛犊
  • 注册日期2002-04-11
  • 最后登录2010-07-12
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望20点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-08-10 12:46
inp和outp都有
不过我要的是inpd和outpd,就是以双字节访问。
我看了一下BC5的设置,默认的就是386。
我还把linker的16-bit linker的enable 32-bit processing 打开了
还是不行
我在myio.asm前面加上了.386
还是不行

谁能比我惨!!!!
用程序表达思想
hywang
驱动牛犊
驱动牛犊
  • 注册日期2002-04-06
  • 最后登录2005-01-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-08-10 15:03
为什么用BC5 ,不用VC6
bodies
驱动牛犊
驱动牛犊
  • 注册日期2002-04-11
  • 最后登录2010-07-12
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望20点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-08-10 15:06
VC6可以把它编译成Dos程序吗?如果你知道,请告诉我。




为什么我这么帅,却要掉头发呢?!
用程序表达思想
chnh
驱动小牛
驱动小牛
  • 注册日期2002-04-09
  • 最后登录2004-02-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-08-10 15:36
直接在命令行用tasm汇编看看有什么错误提示
Iamme
驱动小牛
驱动小牛
  • 注册日期2001-03-23
  • 最后登录2005-10-11
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-08-12 13:28
用BC3.1吧
写Dos程序当然最好用Dos下的工具
把指令设置为386
把通过汇编器编译也设置上
Go,go ahead
Iamme
驱动小牛
驱动小牛
  • 注册日期2001-03-23
  • 最后登录2005-10-11
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-08-12 13:30
在BC下用嵌入式汇编
Go,go ahead
WindThruEars
驱动老牛
驱动老牛
  • 注册日期2002-11-17
  • 最后登录2004-07-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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.
我是假耳朵
Iamme
驱动小牛
驱动小牛
  • 注册日期2001-03-23
  • 最后登录2005-10-11
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-08-13 08:41
不对吧
asm in eax dx也可以用的
Go,go ahead
chnh
驱动小牛
驱动小牛
  • 注册日期2002-04-09
  • 最后登录2004-02-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-08-13 12:12
可用
游客

返回顶部