繁体   English   中英

转换问题:__ asm__ __volatile__

[英]Converting problem: __asm__ __volatile__

我已经在linux环境中与Nasm打交道已经有一段时间了,这个功能运行得很好......但是现在我正在切换到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抛出一个错误,说“string”,我也尝试编写_asm volatile但是我得到一个错误,说''opcode'中的内联汇编语法错误;找到'数据类型'“

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

  1. 指令“outb”输出一个字节,这相当于C / C ++中的“char”或“unsigned char”类型。 对于输出16位(因为你使用的是“unsigned short”),单词需要使用“outw”
  2. 话虽如此,英特尔建议(并且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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM