我花了 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’
and
error: undefined named operand ‘vendername+8’
如何将代码从 Intel 汇编转换为 AT&T 汇编?
经验法则是,如果你曾经写过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 个双字解释为字符串,因此情况变得很复杂。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)