转换的问题:__asm____挥发性__
-
21-09-2019 - |
题
我已经处理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命令设置的,这里有几件事情要记住:
- 该指令"b"输出的一个字节,其中将相当于类型"char"或"unsigned char"在C/C++。用于输出16位(因为你使用"unsigned short")一词需要使用"outw"
- 有的说,建议通过英特尔(和所需的通过VS)使用该指令的记忆"走出去"和港口的尺寸是认识到从操作数的大小。例如,"出dx, ax"就等同于"outw",同时"出dx, al"等同于"b"
- 在x86的"推"的指令,要求港口和输出值被放置到(e)dx并{eax/斧/al}寄存器。同时Nasm可能这样做对你(我没有编译器方便,所以我不能确认),在VS你必须这样做的方式这样做是对的CPU的水平。
- 没有理由指定的"挥发性"的关键词与__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;
}
不隶属于 StackOverflow