c - 如何在 c 中使用 64 位内联汇编?

标签 c gcc assembly 64-bit

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,寄存器再次重命名为 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;
}

输出:

00001010 10110000 00000000 00000000 00110010 00110001 01110100 00110010

关于c - 如何在 c 中使用 64 位内联汇编?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26855382/

相关文章:

c - C 中使用 pthread 和信号量的读写器问题

c - 如何在c中为非内核应用程序指定内核头文件的路径?

Linux x64 : why does r10 come before r8 and r9 in syscalls?

c - GCC 符号查找错误

c - 无法将 (int*) 转换为 int

gcc - 在没有yum的情况下在CentOS上安装gcc-c++

c++ - 为模板参数提供默认参数时,VS 2017 无法正确找到以前定义的类型

c - float[] 数组的平均值(Intel 8086)

assembly - 如何将shellcode分解为汇编指令? [复制]

c - 在结构体中使用函数指针 - C 编译器