在过去的两天里,我一直在学习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程序集?
发布于 2013-10-16 20:14:27
你可以这样做:
#include <stdio.h>
int main(int argc, char **argv) {
static char vendername[50] = {0};
__asm__ __volatile__ (
"movl $0, %%eax\n"
"cpuid\n"
"movl %%ebx, %0\n"
"movl %%edx, %0 + 4\n"
"movl %%ecx, %0 + 8\n"
:"=m"(vendername)
:
:"eax", "ebx", "edx", "ecx"
);
printf("%s\n", vendername);
return 0;
}发布于 2013-10-16 19:44:38
经验法则是,如果您曾经用内联asm编写mov,您可能做错了:)编译器可以自己为您加载/存储值。
int dummy;
union {
char text[12];
struct {
int ebx;
int edx;
int ecx;
};
} vendorname;
__asm__(
"cpuid \n"
: "=b" (vendorname.ebx), "=d" (vendorname.edx), "=c" (vendorname.ecx), "=a" (dummy)
: "a" (0)
);请注意,由于必须将3个dword解释为一个字符串,情况变得复杂了。
https://stackoverflow.com/questions/19411410
复制相似问题