I/O端口读写的实现

细心的读者会发现,C++ Builder不再支持如inportb()、outportb()一类I/O端口读写指令了。准确地说,在Windows环境下,Borland C++仅支持16位应用程序的端口操作,对32位应用程序的端口操作不再支持,而C++ Builder开发出来的程序是32位的。我个人以为,这是C++ Builder设计者的败笔。因为PC机中,I/O地址空间与内存地址空间从来都是各自独立的。看看Delphi,不就通过Port数组实现了对I/O端口的访问了吗?搞不清楚为什么C++ Builder就没有提供类似的机制?下面这几个函数是笔者从网上淘下来的,经过验证,在Windows95环境下,的确可实现对I/O端口的读写。读者可以借鉴使用。

void outportb(unsigned short int port,unsigned char value)
{
//move dx,*(&port);
__emit__(0x8b,0x95,&port);
//mov al,*(&value);
__emit__(0x8a,0x85,&value);
//out dx,al;
__emit__(0x66,0xee);
}
void outportw(unsigned short int port,unsigned short int value)
{
//move dx,*(&port);
__emit__(0x8b,0x95,&port);
//mov ax,*(&value);
__emit__(0x66,0x8b,0x85,&value);
//out dx,ax;
__emit__(0xef);
}
unsigned char inportb(unsigned short int port)
{
unsigned char value;
//move dx,*(&port);
__emit__(0x8b,0x95,&port);
//in al,dx;
__emit__(0x66,0xec);
//mov *(&value),al;
__emit__(0x88,0x85,&value);
return value;
}
unsigned short int inportw(unsigned short int port)
{
unsigned short int value;
//move dx,*(&port);
__emit__(0x8b,0x95,&port);
//in ax,dx
__emit__(0xed);
//mov *(&value),ax
__emit__(0x66,0x89,0x85,&value);
return value;
}

时间: 2024-08-01 19:01:21

I/O端口读写的实现的相关文章

CB下实现对端口读写的两种方法

在C++Builder中,不能够使用Turbo C中的outputb和inputb端口读写函数.但我们可以有另外两种办法实现这个功能.本文介绍怎样在C++Builder下实现端口读写,并给出两种方法的源代码. 在C++Builder下对端口的读写共有两种方法,一种为内嵌汇编语言,另一种为使用__emit__函数. 1 通过内嵌汇编语言实现端口的读写 在C++Builder中,汇编语句必须被包含在以关键字asm为起始的一对大括号中: asm {汇编语句1--} 利用内嵌汇编语言编制端口输出函数如下

C#(.Net) 配合WQL实现并口读写

最近做开发,要对POS打印机就进行编程,说白了,也就是一个端口读写,再根据打印机说明实现几个 POS指令就OK了,但是遇到了一个困难的问题,因为是无人系统,一个打印机打印客户单据,一个打印历 史单据,这个还不是最要命的,最要命的是一个是串口的,一个是并口的,对于串口还好办,因为.Net里 有现成的SerialPort类,可是并口就难了. 搜了一下网上的资料,不外乎两种方法. 第一种是用win32 API来实现.见 http://support.microsoft.com/kb/823179/zh

磁盘格式化的编程实现

编程 盘格式化是计算机用户经常使用的操作之一,但由于操作系统的控制台和外壳(Shell)提供了对格式化的完美支持,使编程人员很容易忽视用户对格式化的基本需求.在他们看来,磁盘格式化对用户来说并不是一个太大的问题,应用程序不必要对它提供支持.其实,这是一个错觉,当用户在运行应用程序遇到需要格式化磁盘时,再切换到控制台或者资源管理器去格式化磁盘是非常不便和烦琐的. 还有一部分编程人员认为磁盘格式化很容易实现,没有技术障碍,因此没有赋予足够重视.其实,在实际编程时笔者发现磁盘格式化是一个不大不小的问题

symbian串行通信

串行通信是一种用于两台设备间(典型情况下是距离较近)传输数据的低级别点对点技术.Series60支持红外线和蓝牙上的串行通信.Series60实现的中心是串行通信服务器(Serial Communication Server,又称Comms服务器或C32).它使用Symbian OS客户端/服务器框架,提供对串行硬件的访问,并且是通用的和共享的.通用是指红外线和蓝牙串行通信使用相同的API,共享是指多个客户端线程可以安全地并发使用同一个串行端口. Series60中所有的串行通信都使用下列基本步

VxWorks中的中断应用设计要点

硬件中断处理是实时系统设计中的关键性问题,设计人员有必要对其作深入研究,以更好地满足开发工作需要.文中以VxWorks操作系统为软件平台,讨论了在实时系统中进行中断应用设计时要注意的一些问题.由于软硬件的相关性,选用广泛应用的X86架构的嵌入式汁算机为硬件平台,对PenriumCPU和计算机主板对硬件中断的管理机制也做了详细介绍 所得出的研究结论在具体的开发项目中均得以验证,可供相关技术人员参考. 硬件中断处理是实时系统设计中最重要.最关键的问题.文中综合软硬件,从工程应用的角度对此问题加以讨论

保护模式汇编系列之一 - 初探保护模式

为了后面学习操作系统的需要,从今天开始我要研究x86的汇编了.所以我决定开始总结并连载x86的汇编系列,这是第一篇--初探保护模式. 我假定读者接触过16位的汇编语言,并理解汇编语言的基本概念.熟悉8086处理器采用的"段寄存器 * 16 + 偏移地址"的寻址方法. 我们从80386处理器入手.首先,到了80386时代,CPU有了三种运行模式,即实模式.保护模式和虚拟8086模式. 实模式指的是8086CPU的运行模式,不过这是后来提出的概念,在8086时代只有当时的运行模式,自然也就

018_《Delphi下深入Windows核心编程》

<Delphi下深入Windows核心编程> Delphi 教程 系列书籍 (018) <Delphi下深入Windows核心编程> 网友(邦)整理 EMail: shuaihj@163.com 下载地址: Part1 Part2 Part3     书名: Delphi下深入Windows核心编程 作者: 飞思科技产品研发中心 出版社: 电子工业出版社 书号: 7505384023 出版日期:2003年1月 开本: 787*1092 1/16 页码: 525 版次: 2003年1

.NET 串口通信

原文:.NET 串口通信 这段时间做了一个和硬件设备通信的小项目,涉及到扫描头.输送线.称重机.贴标机等硬件.和各设备之间通信使用的是串口或网络(Socket)的方式.扫描头和贴标机使用的网络通信,输送线和称重机使用的是串口通信. 串口通信,以前一直觉得神秘,没想到用起来却这么简单.当然,这样简单要归功于 .NET 对其操作的封装. .NET 里提供了专门操作串口的类 System.IO.Ports.SerialPort,可以操作串口收发数据.只需要 new 一个对象,简单配置一下相关属性,就可

《操作系统真象还原》——1.2 我们需要哪些编译器

1.2 我们需要哪些编译器 C语言虽然不是为设计大型软件而生的,但其却被用来开发大型软件. 现代操作系统基本上是用C语言再结合汇编语言开发的,所以C语言编译器,我们选择的是gcc.而汇编语言编译器,我们选择的是nasm.为什么选择这两个,首先因为它们都是开源软件,其次其强大的功能不亚于同类的商业软件. 1.2.1 世界顶级编译器GCC 秉着简单至上的原则,我们在开发过程中,能用简单的工具就不用复杂的.所以我们的系统,绝大部分是C语言实现的,而且并不需要多么高深的算法及数据结构功底. 另外我们在L