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를 인라인 어셈블리
'eax' 32 비트 레지스터이다. 이것은 64 비트'rax' 레지스터의 하위 32 비트입니다. –
'gcc -m64'를 사용하여 코드가 64 비트 모드로 컴파일되었는지 확실히하십시오. (대응하는'gcc -m32'도 있습니다.) – pts
코드 포맷이 엉망이며 게시 한 원본 코드에 구문 오류가 많이 있습니다 (예 : 프로그램 끝에서'누락 '). 난 당신을 위해 질문에 코드에서 이러한 명백한 오류의 대부분을 해결했습니다. 있는 그대로 노력하고 게시하십시오. http://sscce.org/를 따르십시오. 두 번 확인하고 게시 한 코드가 정상적으로 컴파일되었는지 (즉, 'gcc -W -Wall -Wextra'와 함께 경고없이) 명시 적으로 기재하십시오. – pts