📄 20000804013.htm
字号:
<HTML>
<HEAD>
<TITLE>I/O 端口读写的实现</TITLE>
<META content="Microsoft FrontPage 4.0" name=GENERATOR>
</HEAD>
<BODY aLink=#FF0000 bgColor=#ffffff leftMargin=0 link=#187800 topMargin=0
vLink=#990099>
<div align="center">
<table width="744" border="0" cellspacing="0" cellpadding="0" height="76">
<tr>
<td>
<p align="center"><font size="3"><b><br>
I/O 端口读写的实现</b></font>
<p><font color=#333333>细心的读者会发现,C++Builder不再支持如inportb()、outportb()一类I/O端口读写指令了。准确地说,在Windows环境下,BorlandC++仅支持16位应用程序的端口操作,对32位应用程序的端口操作不再支持,而C++Builder开发出来的程序是32位的。我个人以为,这是C++Builder设计者的败笔。因为PC机中,I/O地址空间与内存地址空间从来都是各自独立的。看看Delphi,不就通过Port数组实现了对I/O端口的访问了吗?搞不清楚为什么C++Builder就没有提供类似的机制?下面这几个函数是笔者从网上淘下来的,经过验证,在Windows95环境下,的确可实现对I/O端口的读写。读者可以借鉴使用。</font> <br>
<font
color=#333333>
void outportb(unsigned short int port, unsigned char value)</font>
<p><font
color=#333333>
{</font>
<p><font
color=#333333>
// mov edx, *(&port);</font>
<p><font
color=#333333>
__emit__(0x8b, 0x95, &port);</font>
<p><font
color=#333333>
// mov al, *(&value);</font>
<p><font
color=#333333>
__emit__(0x8a, 0x85, &value);</font>
<p><font
color=#333333>
// out dx, al;</font>
<p><font
color=#333333>
__emit__(0x66, 0xee);</font>
<p><font
color=#333333>
}</font>
<p><font
color=#333333>
void outportw(unsigned short int port, unsigned short int value)</font>
<p><font
color=#333333>
{</font>
<p><font
color=#333333>
// mov edx, *(&port);</font>
<p><font
color=#333333>
__emit__(0x8b, 0x95, &port);</font>
<p><font
color=#333333>
// mov ax, *(&value);</font>
<p><font
color=#333333>
__emit__(0x66, 0x8b, 0x85, &value);</font>
<p><font
color=#333333>
// out dx, ax;</font>
<p><font
color=#333333>
__emit__(0xef);</font>
<p><font
color=#333333>
}</font>
<p><font
color=#333333>
unsigned char inportb(unsigned short int port)</font>
<p><font
color=#333333>
{</font>
<p><font
color=#333333>
unsigned char value;</font>
<p><font
color=#333333>
// mov edx, *(&port);</font>
<p><font
color=#333333>
__emit__(0x8b, 0x95, &port);</font>
<p><font
color=#333333>
// in al, dx;</font>
<p><font
color=#333333>
__emit__(0x66, 0xec);</font>
<p><font
color=#333333>
// mov *(&value), al;</font>
<p><font
color=#333333>
__emit__(0x88, 0x85, &value);</font>
<p><font
color=#333333>
return value;</font>
<p><font
color=#333333>
}</font>
<p><font
color=#333333>
unsigned short int inportw(unsigned short int port)</font>
<p><font
color=#333333>
{</font>
<p><font
color=#333333>
unsigned short int value;</font>
<p><font
color=#333333>
// mov edx, *(&port);</font>
<p><font
color=#333333>
__emit__(0x8b, 0x95, &port);</font>
<p><font
color=#333333>
// in ax, dx</font>
<p><font
color=#333333>
__emit__(0xed);</font>
<p><font
color=#333333>
// mov *(&value), ax</font>
<p><font
color=#333333>
__emit__(0x66, 0x89, 0x85, &value);</font>
<p><font
color=#333333>
return value;</font>
<p><font
color=#333333>
}</font> </p>
</td>
</tr>
</table>
</div>
</BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -