【发布时间】:2013-10-25 00:56:39
【问题描述】:
过去 2 天我一直在研究 AT&T 内联汇编,但我在转换这个时遇到了一些问题:
static char vendername[50] = {0};
_asm {
mov eax, 0
cpuid
mov dword ptr [vendername], ebx
mov dword ptr [vendername+4], edx
mov dword ptr [vendername+8], ecx
}
这是我的尝试:
static char vendername[50] = {0};
__asm__(
"movl $0,%%eax \n"
"cpuid \n"
"movl %%ebx, %[vendername] \n"
"movl %%edx, %[vendername+$4] \n"
"movl %%ecx, %[vendername+$8] \n"
:"=r"(vendername) //user vendername as output
:[vendername]"m"(vendername) //use vendername as input
:"eax","ebx","edx","ecx" // clobbers those regs
);
此代码不起作用,gcc 给我以下错误:
error: undefined named operand ‘vendername+4’
和
error: undefined named operand ‘vendername+8’
如何将代码从 Intel 程序集转换为 AT&T 程序集?
【问题讨论】:
-
您需要使用
__asm__ __volatile__来确保优化器不会删除对CPUID的调用。 -
你不需要内联汇编。 MSVC 和 GNU 编译器已经有内置/包装器。 Intrinsics for CPUID like informations?
标签: gcc assembly x86 inline-assembly