【发布时间】:2014-11-11 00:13:00
【问题描述】:
int main(void) {
unsigned long long a = 0x0ab0000000234432;
unsigned long long b = 0x0000000000000001;
unsigned long long c = 0x0000000032123001;
unsigned long long r1;
__asm__ __volatile__(
"mov %1, %%eax \n\t"
"xor %2, %%eax \n\t"
"xor %3, %%eax "
: "=&a" (r1)
: "g" (a), "g" (b), "g"(c));
for(i=63; i>=0; i--) {
printf("%d ", (r1 >> i) & 1 );
if (i%8 == 0) printf(" ");
}
printf("\n");
return 0;
}
二进制值是那个
a = 00001010 10110000 00000000 00000000 00000000 00100011 01000100 00110010
b = 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001
c = 00000000 00000000 00000000 00000000 00110010 00010010 00110000 00000001
我想得到 00001010 10110000 00000000 00000000 00110010 00110001 01110100 00110010 的结果。
但是,结果是 00000000 00000000 00000000 00000000 00110010 00110001 01110100 00110010
我认为代码是通过 32 位模式编译的。
我使用 MAC OS X、英特尔 CPU 和 GCC。
如何使用 64 位内联汇编
【问题讨论】:
-
eax是一个 32 位寄存器。它是 64 位rax寄存器的低 32 位。 -
使用
gcc -m64绝对确保您的代码是在 64 位模式下编译的。 (也有对应的gcc -m32。) -
您的代码格式很糟糕,并且您发布的原始代码包含许多语法错误(例如在程序末尾缺少
})。我已经为您修复了问题代码中的大部分明显错误。请努力并按原样发布工作代码。请关注sscce.org。请仔细检查并明确声明您发布的代码编译干净(即没有gcc -W -Wall -Wextra的警告)。 -
谢谢!效果很好。