도움이 되었습니까?

해결책

여러 가지 포인터 : 먼저 - GCC 스타일 인라인 어셈블리를 사용하는 MS 스타일에서 사용할 수 있습니다 -

__asm{ ... }
.

두 번째 - 지침은 기능이 아닙니다. 그래서 괄호가 잘못되었습니다.

마지막으로 가장 중요하지만 fabs는 인수가 아니며 FP 스택의 맨 위로 작동합니다.먼저 변수를 명시 적으로로드해야합니다.이것을 시도하십시오 :

__asm {
    fld x
    fabs
    fstp x
}
.

Old X87 지침을 사용하는 것은 아마도 좋은 일이 아니며, 아마도 매우 비효율적 일 것입니다 - SSE 솔루션으로 전환해야합니다, SSE 명령어 세트를 사용하여 2 배 또는 4 개의 플로트를 절대적으로 사용하는 방법은 무엇입니까?(최대 SSE4)

다른 팁

VC ++를 사용하면 어셈블리 언어를 괄호 안에 묶지 않습니다.올바른 구문은 다음과 같습니다.

__asm fabs
.

또는 :

__asm { 
    fabs
    // possibly more instructions here
}
.

특정 경우에는 다음과 같은 것을 원할 것입니다 :

__asm { 
    fload x // load x onto F.P. stack
    fabs    // take absolute value
    fstp x  // store back to x and pop from F.P. stack.
}
.

원본 및 대상 이동에 따라 x86의 부동 소수점은 스택을 사용합니다.달리 명시하지 않는 한 대부분의 지시 사항 (로드 / 저장소 이외)은 스택 상단에서 피연산자를 취하고 스택 상단의 결과를 입금합니다.예를 들어 피연산자가 없으면 fabs는 부동 소수점 스택의 맨 위에있는 피연산자의 절대 값을 사용하여 결과를 동일한 위치에 다시 보관합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top