//这是一段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
挤一挤
#2
32位的机器中的16位程序只能做16位的操作
为什么还用TC呢
为什么还用TC呢
#3
这个问题比较高大上。我也不会。楼主参考下面?
《The Intel 64 and IA-32 Architectures Software Developer's Manual》
《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环境下。
1、在Windows下安装VirtualBox;
2、在VirtualBox下安装DOS6.22;
3、在DOS6.22安装Turbo C 2.0;
然后就在TC中编译程序,把整个当成是DOS环境下。
#5
你的思路已经很清晰了,既然你的C编译器不支持emit,那只有单独写一个小文件实现这个功能。你用TC,我有与之配套的TASM汇编器,建议你用我资源中的Turbo C 3.0 http://download.csdn.net/detail/binaryhead/2987356,我特意把Tasm.exe、Tlink.exe、Make.exe集成进去了
#6
单独写一个小汇编文件实现这个功能
#7
记得WATCOM C可以在纯DOS环境下使用32位程序。
#8
用TC的原因是编写DOS界面的时候比较好用,因为这些程序都是以一个小工具形式呈现出来的,所以除了小部分核心程序以外,多数代码都是在编译一个可以让用户可操作的界面。
我在写这个PCI读取工具的时候,放弃了使用IO端口 0cf8 0cfc,改用了BIOS中断。其中终端号为0x1a,ax入口参数为0xb109。
不过我还是会参考借鉴大家的资源继续研究使用16位,32位汇编去尝试编译32位,64位程式。
最后感谢各位大神的指点,谢谢你们的资源,感谢大家的热心帮助。
我在写这个PCI读取工具的时候,放弃了使用IO端口 0cf8 0cfc,改用了BIOS中断。其中终端号为0x1a,ax入口参数为0xb109。
不过我还是会参考借鉴大家的资源继续研究使用16位,32位汇编去尝试编译32位,64位程式。
最后感谢各位大神的指点,谢谢你们的资源,感谢大家的热心帮助。
#1
挤一挤
#2
32位的机器中的16位程序只能做16位的操作
为什么还用TC呢
为什么还用TC呢
#3
这个问题比较高大上。我也不会。楼主参考下面?
《The Intel 64 and IA-32 Architectures Software Developer's Manual》
《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环境下。
1、在Windows下安装VirtualBox;
2、在VirtualBox下安装DOS6.22;
3、在DOS6.22安装Turbo C 2.0;
然后就在TC中编译程序,把整个当成是DOS环境下。
#5
你的思路已经很清晰了,既然你的C编译器不支持emit,那只有单独写一个小文件实现这个功能。你用TC,我有与之配套的TASM汇编器,建议你用我资源中的Turbo C 3.0 http://download.csdn.net/detail/binaryhead/2987356,我特意把Tasm.exe、Tlink.exe、Make.exe集成进去了
#6
单独写一个小汇编文件实现这个功能
#7
记得WATCOM C可以在纯DOS环境下使用32位程序。
#8
用TC的原因是编写DOS界面的时候比较好用,因为这些程序都是以一个小工具形式呈现出来的,所以除了小部分核心程序以外,多数代码都是在编译一个可以让用户可操作的界面。
我在写这个PCI读取工具的时候,放弃了使用IO端口 0cf8 0cfc,改用了BIOS中断。其中终端号为0x1a,ax入口参数为0xb109。
不过我还是会参考借鉴大家的资源继续研究使用16位,32位汇编去尝试编译32位,64位程式。
最后感谢各位大神的指点,谢谢你们的资源,感谢大家的热心帮助。
我在写这个PCI读取工具的时候,放弃了使用IO端口 0cf8 0cfc,改用了BIOS中断。其中终端号为0x1a,ax入口参数为0xb109。
不过我还是会参考借鉴大家的资源继续研究使用16位,32位汇编去尝试编译32位,64位程式。
最后感谢各位大神的指点,谢谢你们的资源,感谢大家的热心帮助。