VS C ++에서 IA32 지침 'Fabs'를 사용하는 방법은 무엇입니까?
-
21-12-2019 - |
문제
이것은 조립을 사용하는 첫 번째 시도이며 Intel 아키텍처 명령어 FABS
를 사용하려고합니다.(이 문서).
조립에 대해 알고있는 작은 조직은 출처와 목적지를 포함하지만,이 명령에 대한 표기법에 대한 언급은 보이지 않습니다.
아래의 시도 중 하나입니다 (Visual Studio 2012, C ++ 사용) :
double myabs(double x){
__asm(fabs(x));
return x;
}
.
이 특별한 시도는 오류 C2400 : 인라인 어셈블러 구문 오류 'opcode'에 오류가 발생합니다.발견 된 '('
)어셈블리 명령을 사용하고 다른 / "더 나은"옵션에 관심이 없으므로 사용할 수 있습니다.
해결책
여러 가지 포인터 : 먼저 - 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
는 부동 소수점 스택의 맨 위에있는 피연산자의 절대 값을 사용하여 결과를 동일한 위치에 다시 보관합니다.