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 位内联汇编
最佳答案
根据 Greg 的回答,您正在尝试使用 32-bit
寄存器 eax
并想要填充 64-bits
进入他们。你不能。 X86_x64 汇编器是 32 位汇编器的扩展(但有许多插件)。出于此处的目的,寄存器大小从 32-bit
增加到 64-bit
并且寄存器也被重命名。就像 16-bit
寄存器增加到 32-bit
并将 ax
重命名为 eax
一样,增加到64-bit
,寄存器再次重命名为 eax
为 rax
。这些是唯一需要的更改。示例:
#include <stdio.h>
int main ()
{
unsigned long long a = 0x0ab0000000234432;
unsigned long long b = 0x0000000000000001;
unsigned long long c = 0x0000000032123001;
unsigned long long r1;
int i = 0;
__asm__ __volatile__(
"mov %1, %%rax \n\t"
"xor %2, %%rax \n\t"
"xor %3, %%rax "
: "=&a" (r1)
: "g" (a), "g" (b), "g"(c));
for(i=63; i>=0; i--){
printf("%d", (int)(r1 >> i) & 1 );
if(i%8 == 0 ) printf(" ");
}
printf("\n");
return 0;
}
输出:
00001010 10110000 00000000 00000000 00110010 00110001 01110100 00110010
关于c - 如何在 c 中使用 64 位内联汇编?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26855382/