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,Intel CPU和GCC。
如何使用64位内联汇编?
eax
是一个32位寄存器。它是64位rax
寄存器的低32位。 - Paul Roubgcc -m64
来确保你的代码在 64 位模式下编译。(也有相应的gcc -m32
) - pts}
)。我已经为你修复了大部分明显的问题。请花些心思,将可运行的代码发布出来。请遵循http://sscce.org/。请仔细检查并明确声明您发布的代码可以通过`gcc -W -Wall -Wextra`编译而不产生警告。 - pts