2014-05-18 5 views
2

나는,어셈블리 언어 구문 분석 오류 '['너희 중에 누구든지 나에게 어떤 도움을 줄 것인지 토큰

또한 라인 (24) (나는 믿는다) " '['토큰 전에 구문 분석 오류"에 구문 분석 오류 팁과 통찰력을 가지고 프로젝트에 대해 매우 감사하게 생각합니다. 나는 asm에서 수행 된 모든 계산으로 pow 함수를 만들었습니다.이 코드는 FPU를 0으로 변경하여 지수를 2 부분으로 나눌 수 있습니다 (예 : 2^3.2 = 2^3 * 2^0.2)

#include <stdio.h> 
#include <stdlib.h> 

#define PRECISION   3 
#define RND_CTL_BIT_SHIFT 10 

// floating point rounding modes: IA-32 Manual, Vol. 1, p. 4-20 
typedef enum { 
    ROUND_TOWARD_ZERO =  3 << RND_CTL_BIT_SHIFT 
} RoundingMode; 

int main(int argc, char **argv) 
{ 

     int fpMask  = 0x1F9FF; 
     int localVar = 0x00000; 

     asm("   FSTCW   %[localVarIn]     \n" // store FPU control word into localVar 
      "   add    %[localVarIn], %[fpMaskOut]  \n" // add fpMaskIn to localVar 

     : [localVarOut] "=m" (localVar) 
     : [fpMaskOut]  "=m" (fpMask) 

     : [localVarIn] "m"  (localVar) 
     : [fpMaskIn]  "m"  (localVar) 
    ); 

    printf("FPU is 0x%08X\n\n", localVar); 

return 0; 

} 
+0

Cygwin에서 gcc를 사용하고 있습니다. 죄송합니다. –

답변

3

여러분의 clobber 목록이 약간 잘못되었다고 생각합니다. GCC, 이들은 다음의 형태로 받아 각 클래스 대장 구분 것을

asm("MY ASM CODE" : output0, output1, outputn 
        : input0, input1, inputn 
        : clobber0, clobber1, clobbern); 

주 내의 각각의 요소 (즉, 는 출력에서, 가 세트 입력 등의) 집합은 쉼표로 구분됩니다. 따라서 ASM을 다음과 같이 변경하십시오.

asm("   FSTCW   %[localVarIn]     \n" // store FPU control word into localVar 
    "   add    %[localVarIn], %[fpMaskOut]  \n" // add fpMaskIn to localVar 

    : [localVarOut] "=m" (localVar),   // Outputs... 
     [fpMaskOut]  "=m" (fpMask) 

    : [localVarIn] "m"  (localVar),   // Inputs... 
     [fpMaskIn]  "m"  (localVar) 
+0

이것은 문제를 없앴습니다.하지만 1이 참수되고 2가 그 자리에서 자라날 때가 있습니다.) –

+0

그래, 내 x86 ASM 기술은 기본적으로 존재하지 않기 때문에 더 이상 당신을 도울 수 없다. 하나 : P – slugonamission