我已经处理Nasm在linux的环境对于一些时间,这种功能的工作。但我现在切换到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是没有更多的认识和动荡引发一个错误说"string",我也试着写_asm挥发性的但我得到一个错误说法"的内联汇编中的语法错误'操作码';发现的数据类型'"

有帮助吗?

解决方案

假设你说的是x86命令设置的,这里有几件事情要记住:

  1. 该指令"b"输出的一个字节,其中将相当于类型"char"或"unsigned char"在C/C++。用于输出16位(因为你使用"unsigned short")一词需要使用"outw"
  2. 有的说,建议通过英特尔(和所需的通过VS)使用该指令的记忆"走出去"和港口的尺寸是认识到从操作数的大小。例如,"出dx, ax"就等同于"outw",同时"出dx, al"等同于"b"
  3. 在x86的"推"的指令,要求港口和输出值被放置到(e)dx并{eax/斧/al}寄存器。同时Nasm可能这样做对你(我没有编译器方便,所以我不能确认),在VS你必须这样做的方式这样做是对的CPU的水平。
  4. 没有理由指定的"挥发性"的关键词与__asm。任何内联会指令引起VS编译器,禁止阅读缓存(什么易挥发的关键词是为)

这里是代码(假设你写到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归因
不隶属于 StackOverflow
scroll top