gpt4 book ai didi

转换问题: __asm__ __volatile__ from GNU C to MSVC for in/out wrappers

转载 作者:太空狗 更新时间:2023-10-29 14:58:25 34 4
gpt4 key购买 nike

我在 Linux 环境中处理 Nasm 和 GNU C 内联 asm 有一段时间了,这个功能工作得很好......但现在我正在切换到 Windows 环境,我想使用 Masm(与 VS2008)我不能似乎让这个工作...

void outportb (unsigned short _port, unsigned short _data)
{
__asm__ __volatile__ ("outb %1, %0" : : "dN" (_port), "a" (_data));
}

当我写这样的东西时...

void outportb (unsigned short _port, unsigned short _data)
{
asm volatile ("outb %1, %0" : : "dN" (_port), "a" (_data));
}

asm 不再被识别并且 volatile 抛出一个错误说“字符串”,我也尝试写 _asm volatile 但我得到一个错误说“'opcode' 中的内联汇编语法错误;找到'数据类型'”

最佳答案

假设您正在谈论 x86 命令集,请记住以下几点:

  1. 指令“outb”输出一个字节,相当于C/C++中的类型“char”或“unsigned char”。要输出 16 位(因为您使用的是“unsigned short”)字,需要使用“outw”
  2. 话虽如此,Intel 建议(VS 要求)您使用指令助记符“out”,端口大小是从操作数大小识别的。例如“out dx, ax”相当于“outw”,而“out dx, al”相当于“outb”
  3. 在 x86 上,“out”指令要求将端口和输出值分别放入 (e)dx 和 {eax/ax/al} 寄存器。虽然 Nasm 可能会为您完成(我手边没有编译器,所以我无法确认),但在 VS 中,您必须按照在 CPU 级别完成的方式来完成。
  4. 没有理由为 __asm 指定“volatile”关键字。任何内联汇编指令都会导致 VS 编译器禁用读取缓存(volatile 关键字的用途)

这是代码(假设您正在写入 16 位端口):

void outportw(unsigned short port, unsigned short data)
{
__asm mov ax, data;
__asm mov dx, port;
__asm out dx, ax;
}

如果您正在写入 8 位端口,代码应如下所示:

void outportb(unsigned short port, unsigned char data)
{
__asm mov al, data;
__asm mov dx, port;
__asm out dx, al;
}

关于转换问题: __asm__ __volatile__ from GNU C to MSVC for in/out wrappers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1385487/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com