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

3
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位内联汇编?


1
eax 是一个32位寄存器。它是64位 rax 寄存器的低32位。 - Paul Roub
使用 gcc -m64 来确保你的代码在 64 位模式下编译。(也有相应的 gcc -m32 - pts
你的代码格式很糟糕,原始代码中包含许多语法错误(例如程序末尾缺少})。我已经为你修复了大部分明显的问题。请花些心思,将可运行的代码发布出来。请遵循http://sscce.org/。请仔细检查并明确声明您发布的代码可以通过`gcc -W -Wall -Wextra`编译而不产生警告。 - pts
谢谢!它工作得很好。 - user3141590
2个回答

5

在Greg的回答之后,你试图使用 32位 寄存器 eax 并想要将 64位 数据塞进去,这是不可能的。X86_x64汇编语言是32位汇编语言的扩展(但有许多附加组件)。为此,寄存器大小从 32位 扩展到了 64位,并且寄存器也被重命名。 就像 16位 寄存器被增加到了 32位 并且从 ax 重命名为 eax 一样,随着增加到 64位,寄存器再次更名为 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

5

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接