我如何在 C 中使用 64 位内联汇编?

use*_*590 3 c 64-bit assembly gcc

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;
}
Run Code Online (Sandbox Code Playgroud)

二进制值是
a = 00001010 10110000 00000000 00000000 00000000 00100011 01000100 00110010
b = 00000000 00000000 00000000 00000000 0000000 0 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 位内联汇编

Gre*_*ill 5

您正在使用eax寄存器。它只有 32 位。使用rax


Dav*_*ica 5

继格雷格的回答值得投票后,您正在尝试使用32-bit寄存器eax并想要填充64-bits它们。你不能。X86_x64 汇编器是 32 位汇编的扩展(但有许多插件)。出于此处的目的,寄存器大小从 增加到 ,32-bit并且64-bit寄存器也被重命名。正如16-bit寄存器增加到32-bit并重命名ax为一样eax,随着增加到64-bit,寄存器再次重命名eaxrax。这些是唯一需要的改变。例子:

#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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

00001010 10110000 00000000 00000000 00110010 00110001 01110100 00110010
Run Code Online (Sandbox Code Playgroud)