簡體   English   中英

如何在C中使用64位內聯匯編?

[英]how can i use 64 bits inline assembly in c?

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位內聯匯編

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

接下來Greg的答案保證了upvoting,你試圖使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM