2017-03-13 6 views
1

여기서 Linux에서 Voxlap을 빌드하려고 시도하고 있습니다. https://github.com/Ericson2314/Voxlap인라인 asm을 컴파일 할 때 오류가 발생했습니다 : "invalid 'asm': 피연산자가 조건 코드가 아니며 잘못된 피연산자 코드 'c'"

source/sdlmain.cpp: In function ‘void fpuinit(long int)’: 
source/sdlmain.cpp:1814:3: error: invalid 'asm': operand is not a condition code, invalid operand code 'c' 
); 
^ 

source/sdlmain.cpp:1814:3: error: invalid 'asm': operand is not a condition code, invalid operand code 'c' 
source/sdlmain.cpp:1814:3: error: invalid 'asm': operand is not a condition code, invalid operand code 'c' 
source/sdlmain.cpp:1814:3: error: invalid 'asm': operand is not a condition code, invalid operand code 'c' 

기분을 상하게하는 코드는 여기에 있습니다 : :

static long fpuasm[2]; 
static inline void fpuinit (long a) 
{ 
    __asm__ __volatile__ 
    (
     "fninit\n" 
     "fstcww %c[fp]\n" 
     "andb $240, %c[fp]+1(,1)\n" 
     "orb %%al, %c[fp]+1(,1)\n" 
     "fldcww %c[fp]\n" 
     : 
     : "a" (a), [fp] "p" (fpuasm) 
     : "cc" 
    ); 
} 

컴파일러 오류가이 부분

: "cc" 
01 가리키는 그래서 인라인 어셈블리에 대한 오류 메시지가 23,516,

주시면 감사하겠습니다 오류 메시지 또는 실제 문제를 해독 어떤 도움 덕분에

+0

스택 오버플로에 오신 것을 환영합니다. [The Tour] (http://stackoverflow.com/tour)를 읽으신 후 [Help Center] (http://stackoverflow.com/help/asking)의 자료를 참조하십시오. 여기에 물어보십시오. –

+0

내가 한 질문에 문제가 있었습니까? –

+0

필요에 따라 [MCVE]를 제공해주십시오. –

답변

2

마이클 페치가 문제의 직접적인 원인은 아마도 설명 하듯이 때문에 우분투 현재 위치 독립적 인 실행 파일을 생성 GCC의 버전과 함께 제공 (PIE). 컴파일러에서 위치 독립적 코드 (PIC)를 생성 할 때 asm 문은 작동하지 않습니다. 가 동일해야로서 당신은 아마 다음과 코드를 대체 할 수

static inline void fpuinit (long a) 
{ 
    asm volatile (
     "mov %1, %0\n\t" 
     "fninit\n\t" 
     "fldcw %0\n" 
     :: "m" (*(short *)fpuasm), 
     "ir" ((short) (0x037F & 0xF0FF | (a & 0xFF) << 8))); 
} 

이 어색한 "p" "포인터"제약과 그것이 간단한 작업을 할 필요가 c "상수"피연산자 수정을 대체 "m" "메모리"제약 조건. 이것은 PIC로 컴파일되는지 여부와 상관없이 장점이 있습니다. 또한 32 비트 및 64 비트 대상에서 모두 작동합니다.

또한 FNINIT 명령어가 FPU 제어 워드를 알려진 상태 (0x037F)로 설정하므로 FSTCW 명령어를 사용하여 읽을 필요가 없다는 점을 이용하여 코드 최적화의 자유를 얻었습니다.