【问题标题】:how can i use 64 bits inline assembly in c?如何在 c 中使用 64 位内联汇编?
【发布时间】:2014-11-11 00:13:00
【问题描述】:
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 位内联汇编

【问题讨论】:

  • eax 是一个 32 位寄存器。它是 64 位 rax 寄存器的低 32 位。
  • 使用gcc -m64 绝对确保您的代码是在 64 位模式下编译的。 (也有对应的gcc -m32。)
  • 您的代码格式很糟糕,并且您发布的原始代码包含许多语法错误(例如在程序末尾缺少})。我已经为您修复了问题代码中的大部分明显错误。请努力并按原样发布工作代码。请关注sscce.org。请仔细检查并明确声明您发布的代码编译干净(即没有gcc -W -Wall -Wextra 的警告)。
  • 谢谢!效果很好。

标签: c gcc assembly 64-bit


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    根据 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
    

    【讨论】:

      猜你喜欢
      • 2016-03-31
      • 1970-01-01
      • 2011-01-31
      • 2011-09-04
      • 1970-01-01
      • 2019-03-14
      • 1970-01-01
      • 2017-12-23
      相关资源
      最近更新 更多