DOS下使用win-tc读取PCI端口,其中32位的端口如何处理?

时间:2021-08-06 13:35:24
现在使用Win-TC编写一段程式,实现在DOS下面遍历该电脑的PCI。PCI的控制端口和数据端口为0cf8、0cfc,都是32位字节的端口,而Win-TC(TC2.0)下面不支持对32位端口的直接操作,请问有什么办法可以实现16位编译环境完成32位端口的读写吗?

//这是一段32位环境下C中嵌入汇编语言,实现0cf8H 0cfcH端口读取的程序。
#define pci  (unsigned long) 0x80000000
            address1=(pci+(bus<<16)+(dev<<11)+(fun<<8)+reg);
        __asm{
              mov eax,address1
              mov dx,0cf8h
              out dx,eax  
              mov dx,0cfch
              in  eax,dx   
              mov result,ax
               }



typedef unsigned char DWORD;
//16位编译环境实现读32位端口
DWORD inpd(int portid)
{
                 DWORD  dwRet;
                 asm mov dx,portid;
                 asm lea bx,dwRet;
                          /*接下来这一段是使用插入机器码,在16位环境下实现对32位的操作。(问题就在这,我的编译环境中emit不识别,请问我该如何插入这段机器码??)*/
                 __emit__(
                             0x66,0x55,            //push  EAX
                             0x66,0xED,           //in EAX,DX
                             0x66,0x89,0x07    //mov [BX],EAX
                             0x66,0x58             //pop EAX
                    return  dwRet;
}



//16位编译环境实现写32位端口
void outpd(int portid,DWORD dwVal)
{
              .........
}

8 个解决方案

#1


挤一挤 DOS下使用win-tc读取PCI端口,其中32位的端口如何处理?

#2


32位的机器中的16位程序只能做16位的操作
为什么还用TC呢

#3


这个问题比较高大上。我也不会。楼主参考下面?
《The Intel 64 and IA-32 Architectures Software Developer's Manual》

#4


试试:
1、在Windows下安装VirtualBox;
2、在VirtualBox下安装DOS6.22;
3、在DOS6.22安装Turbo C 2.0;
然后就在TC中编译程序,把整个当成是DOS环境下。

#5


引用 楼主 u013519169 的回复:
现在使用Win-TC编写一段程式,实现在DOS下面遍历该电脑的PCI。PCI的控制端口和数据端口为0cf8、0cfc,都是32位字节的端口,而Win-TC(TC2.0)下面不支持对32位端口的直接操作,请问有什么办法可以实现16位编译环境完成32位端口的读写吗?

//这是一段32位环境下C中嵌入汇编语言,实现0cf8H 0cfcH端口读取的程序。
#define pci  (unsigned long) 0x80000000
            address1=(pci+(bus<<16)+(dev<<11)+(fun<<8)+reg);
        __asm{
              mov eax,address1
              mov dx,0cf8h
              out dx,eax  
              mov dx,0cfch
              in  eax,dx   
              mov result,ax
               }



typedef unsigned char DWORD;
//16位编译环境实现读32位端口
DWORD inpd(int portid)
{
                 DWORD  dwRet;
                 asm mov dx,portid;
                 asm lea bx,dwRet;
                          /*接下来这一段是使用插入机器码,在16位环境下实现对32位的操作。(问题就在这,我的编译环境中emit不识别,请问我该如何插入这段机器码??)*/
                 __emit__(
                             0x66,0x55,            //push  EAX
                             0x66,0xED,           //in EAX,DX
                             0x66,0x89,0x07    //mov [BX],EAX
                             0x66,0x58             //pop EAX
                    return  dwRet;
}



//16位编译环境实现写32位端口
void outpd(int portid,DWORD dwVal)
{
              .........
}

你的思路已经很清晰了,既然你的C编译器不支持emit,那只有单独写一个小文件实现这个功能。你用TC,我有与之配套的TASM汇编器,建议你用我资源中的Turbo C 3.0 http://download.csdn.net/detail/binaryhead/2987356,我特意把Tasm.exe、Tlink.exe、Make.exe集成进去了

#6


单独写一个小汇编文件实现这个功能

#7


引用 3 楼 zhao4zhong1 的回复:
这个问题比较高大上。我也不会。楼主参考下面?
《The Intel 64 and IA-32 Architectures Software Developer's Manual》

记得WATCOM C可以在纯DOS环境下使用32位程序。

#8


               用TC的原因是编写DOS界面的时候比较好用,因为这些程序都是以一个小工具形式呈现出来的,所以除了小部分核心程序以外,多数代码都是在编译一个可以让用户可操作的界面。
               我在写这个PCI读取工具的时候,放弃了使用IO端口 0cf8 0cfc,改用了BIOS中断。其中终端号为0x1a,ax入口参数为0xb109。
             不过我还是会参考借鉴大家的资源继续研究使用16位,32位汇编去尝试编译32位,64位程式。 
   最后感谢各位大神的指点,谢谢你们的资源,感谢大家的热心帮助。

#1


挤一挤 DOS下使用win-tc读取PCI端口,其中32位的端口如何处理?

#2


32位的机器中的16位程序只能做16位的操作
为什么还用TC呢

#3


这个问题比较高大上。我也不会。楼主参考下面?
《The Intel 64 and IA-32 Architectures Software Developer's Manual》

#4


试试:
1、在Windows下安装VirtualBox;
2、在VirtualBox下安装DOS6.22;
3、在DOS6.22安装Turbo C 2.0;
然后就在TC中编译程序,把整个当成是DOS环境下。

#5


引用 楼主 u013519169 的回复:
现在使用Win-TC编写一段程式,实现在DOS下面遍历该电脑的PCI。PCI的控制端口和数据端口为0cf8、0cfc,都是32位字节的端口,而Win-TC(TC2.0)下面不支持对32位端口的直接操作,请问有什么办法可以实现16位编译环境完成32位端口的读写吗?

//这是一段32位环境下C中嵌入汇编语言,实现0cf8H 0cfcH端口读取的程序。
#define pci  (unsigned long) 0x80000000
            address1=(pci+(bus<<16)+(dev<<11)+(fun<<8)+reg);
        __asm{
              mov eax,address1
              mov dx,0cf8h
              out dx,eax  
              mov dx,0cfch
              in  eax,dx   
              mov result,ax
               }



typedef unsigned char DWORD;
//16位编译环境实现读32位端口
DWORD inpd(int portid)
{
                 DWORD  dwRet;
                 asm mov dx,portid;
                 asm lea bx,dwRet;
                          /*接下来这一段是使用插入机器码,在16位环境下实现对32位的操作。(问题就在这,我的编译环境中emit不识别,请问我该如何插入这段机器码??)*/
                 __emit__(
                             0x66,0x55,            //push  EAX
                             0x66,0xED,           //in EAX,DX
                             0x66,0x89,0x07    //mov [BX],EAX
                             0x66,0x58             //pop EAX
                    return  dwRet;
}



//16位编译环境实现写32位端口
void outpd(int portid,DWORD dwVal)
{
              .........
}

你的思路已经很清晰了,既然你的C编译器不支持emit,那只有单独写一个小文件实现这个功能。你用TC,我有与之配套的TASM汇编器,建议你用我资源中的Turbo C 3.0 http://download.csdn.net/detail/binaryhead/2987356,我特意把Tasm.exe、Tlink.exe、Make.exe集成进去了

#6


单独写一个小汇编文件实现这个功能

#7


引用 3 楼 zhao4zhong1 的回复:
这个问题比较高大上。我也不会。楼主参考下面?
《The Intel 64 and IA-32 Architectures Software Developer's Manual》

记得WATCOM C可以在纯DOS环境下使用32位程序。

#8


               用TC的原因是编写DOS界面的时候比较好用,因为这些程序都是以一个小工具形式呈现出来的,所以除了小部分核心程序以外,多数代码都是在编译一个可以让用户可操作的界面。
               我在写这个PCI读取工具的时候,放弃了使用IO端口 0cf8 0cfc,改用了BIOS中断。其中终端号为0x1a,ax入口参数为0xb109。
             不过我还是会参考借鉴大家的资源继续研究使用16位,32位汇编去尝试编译32位,64位程式。 
   最后感谢各位大神的指点,谢谢你们的资源,感谢大家的热心帮助。