2014-11-11 2 views
2
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어떻게 C에서 64 비트 인라인 어셈블리를 사용할 수 있습니까?

I 결과를 얻으려면 00001010 10110000 00000000 00000000 00110010 00110001 01110100 00110010을 받으려고합니다.
하지만 결과는 00000000 00000000 00000000 00000000 00110010 00110001 01110100 00110010

코드는 32 비트 모드로 컴파일됩니다.
MAC OS X, 인텔 CPU 및 GCC를 사용합니다.

어떻게 64bit를 인라인 어셈블리

+1

'eax' 32 비트 레지스터이다. 이것은 64 비트'rax' 레지스터의 하위 32 비트입니다. –

+0

'gcc -m64'를 사용하여 코드가 64 비트 모드로 컴파일되었는지 확실히하십시오. (대응하는'gcc -m32'도 있습니다.) – pts

+0

코드 포맷이 엉망이며 게시 한 원본 코드에 구문 오류가 많이 있습니다 (예 : 프로그램 끝에서'누락 '). 난 당신을 위해 질문에 코드에서 이러한 명백한 오류의 대부분을 해결했습니다. 있는 그대로 노력하고 게시하십시오. http://sscce.org/를 따르십시오. 두 번 확인하고 게시 한 코드가 정상적으로 컴파일되었는지 (즉, 'gcc -W -Wall -Wextra'와 함께 경고없이) 명시 적으로 기재하십시오. – pts

답변

4

당신은 eax 레지스터를 사용하여 사용할 수 있습니다. 32 비트 밖에되지 않습니다. rax을 사용하십시오.

3

upvoting을 보증 한 Greg의 대답에이어서 32-bit 레지스터 eax을 사용하려고하고 64-bits을 처리하려고합니다. 당신은 할 수 없습니다. X86_x64 어셈블러는 32 비트 어셈블리 (그러나 많은 애드온)에 대한 확장입니다. 여기서는 레지스터 크기가 32-bit에서 64-bit으로 변경되었으며 레지스터는으로 바뀐 이었습니다. 16-bit 레지스터가 32-bit으로 증가되었고 마찬가지로 axeax으로 바뀌고 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 
관련 문제