[英]How to convert Intel Assembly C to AT&T C++
我试图将函数“__cpuid”从С语言转换为C++。 我有一个问题,g++ 编译器不能与英特尔汇编器一起使用。
我正在尝试翻译这段代码:
__asm
{
mov esi, CPUInfo
mov eax, InfoType
xor ecx, ecx
cpuid
mov dword ptr[esi + 0], eax
mov dword ptr[esi + 4], ebx
mov dword ptr[esi + 8], ecx
mov dword ptr[esi + 12], edx
}
我尝试使用互联网上的示例进行操作,我得到了这段代码,但它不起作用:
__asm
(
"movl %CPUInfo,%esi\n"
"movl %InfoType,%eax\n"
"xorl %ecx,%ecx\n"
"cpuid\n"
"movl %eax,0(%esi)\n"
"movl %ebx,4(%esi))\n"
"movl %ecx,8(%esi)\n"
"movl %edx,12(%esi)\n"
:"=r"(CPUInfo)
);
void cpuid(int InfoType, int *CPUInfo) {
int a = InfoType;
int c = 0;
int b, d;
__asm__ (
"cpuid"
: "+a"(a), "=b"(b), "+c"(c), "=d"(d)
);
CPUInfo[0] = a;
CPUInfo[1] = b;
CPUInfo[2] = c;
CPUInfo[3] = d;
}
a
、 b
、 c
和d
分别绑定到eax
、 ebx
、 ecx
和edx
寄存器。 GCC 文档详细解释了这是如何工作的。
在 linux(以及许多其他平台,非 linux、非 gcc)上,您可以使用nasm
等汇编程序将 intel 汇编代码组装成目标文件。 然后,您可以将您的汇编对象链接到应用程序中,而无需混合消息或汇编语言语法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.