You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Visual Studio 2017 C++中_outp/_inp等I/O端口API的替代方案咨询

替代VS2017中弃用的I/O端口操作API方案

1. x86 32位项目替代方案

1.1 编译器内置Intrinsic函数

MSVC提供了直接对应I/O端口操作的内置函数,无需手动写汇编,兼容性更好:

  • 字节读:unsigned char __inbyte(unsigned short port);
  • 字节写:void __outbyte(unsigned short port, unsigned char value);
  • 字读:unsigned short __inword(unsigned short port);
  • 字写:void __outword(unsigned short port, unsigned short value);

直接调用这些函数即可,编译器会自动翻译成对应的in/out汇编指令,效率和原API完全一致。

1.2 内嵌汇编实现

如果需要更灵活的控制,可以直接内嵌汇编模拟原API逻辑:

// 模拟 _inp()
unsigned char inp(unsigned short port)
{
    unsigned char val;
    __asm {
        mov dx, port
        in al, dx
        mov val, al
    }
    return val;
}

// 模拟 _outp()
void outp(unsigned short port, unsigned char val)
{
    __asm {
        mov dx, port
        mov al, val
        out dx, al
    }
}

// 模拟 _inpw()
unsigned short inpw(unsigned short port)
{
    unsigned short val;
    __asm {
        mov dx, port
        in ax, dx
        mov val, ax
    }
    return val;
}

// 模拟 _outpw()
void outpw(unsigned short port, unsigned short val)
{
    __asm {
        mov dx, port
        mov ax, val
        out dx, ax
    }
}

2. x64 64位项目替代方案

64位Windows系统禁止用户态程序直接执行in/out指令,必须通过内核模式驱动完成端口操作:

  • 编写轻量内核驱动,封装端口读写逻辑,通过自定义IOCTL与用户态程序通信
  • 用户态程序通过CreateFile打开驱动设备,调用DeviceIoControl发送端口读写请求,由驱动完成实际I/O操作

若项目暂时无需迁移到64位,可保持32位编译,继续使用上述x86替代方案。

3. 临时兼容性过渡方案

如果需要快速适配原有代码,可在项目中定义以下宏(仅适用于32位项目),将旧API直接映射到内置函数:

#define _inp(port) __inbyte(port)
#define _outp(port, val) __outbyte(port, val)
#define _inpw(port) __inword(port)
#define _outpw(port, val) __outword(port, val)

无需修改原有代码的调用逻辑,即可完成底层实现的替换。


内容的提问来源于stack exchange,提问作者Peter Boshra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 22:05:06