📄 lc_bcb_69.html
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>I/O端口读写的实现</title>
</head>
<body>
<div align="center">
<p align="center"><b><font size="+2">I/O 端 口 读 写 的
实 现</font></b><br>
</div>
<p><font color="#333333"> 细 心 的 读 者 会
发现,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 端 口 的 读 写。 读 者 可 以
借 鉴 使 用。</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><br>
<br>
<br>
</p>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -