관련글 : http://asmlove.co.kr/zBdC7/viewtopic.php?t=1776
본 내용은 FPU 명령중에 FLD와 FISTP 에 대한 이해와 gcc와 VC간의 inline assembly 의 변환관계를 다루었던 글입니다.
질문 내용
long long llrint (double x)
{
long long retval;
__asm__ __volatile__ \
("fistpll %0" : "=m" (retval) : "t" (x) : "st"); \
return retval;
}
위 코드입니다.
Visaul C++ 에서 인라인 어셈코드로 바뀌면 어떻게 되나요?
제가 어셈블러를 몰라서입니다.
꼭 가르쳐주세요!!!
답변 내용
| 코드: |
| long long llrint (double x)
{ #if defined(_WIN32) volatile long long r; __asm { FLD QWORD PTR x; FISTP QWORD PTR r; } return(r); #elif defined(__GNUC__) long long retval; __asm__ __volatile__ \ ("fistpll %0" : "=m" (retval) : "t" (x) : "st"); \ return retval; #else # warning not supported llrint function (standard by C99) #endif } |
다음과 같이 하시면 되겠습니다.
이것은 일종의 double 값을 반올림하여 정수로 반환하는 함수가 되겠습니다.
FLD는 FP 에 주어진 메모리를 읽는 명령입니다.
FISTP는 FP에서 읽어와서 메모리로 저장할때 정수로 반올림과 동시에 pop 을 합니다.
제가 알기로는 C99 표준에는 llrint 가 채택된거 같은데 정확한건 모르겠네요.
그래서 llrint 함수는 gcc 에서는 그냥 컴파일 옵션으로 "-std=c99" 와 링크옵션으로 "-lm" 그리고 "math.h"를 include 하면 사용할수 있습니다.




댓글을 달아 주세요