x87 FPU

x87 FPU 는 x86 시스템에서 사용되는 표준 부동소수점연산장치입니다.

I. 기본적 FPU 개념 이해

FPU 는 CPU 에서 지원하지 않는 부동소수점연산을 빠르게 처리하기 위한 프로세서입니다. 현대의 x86 프로세서는 모두 x87 FPU 를 내장하고 있으나 80486 이전의 프로세서에서는 따로 분리된 프로세서이었습니다. (FPU 가 없는 경우의 부동소수점연산은 CPU 에 의한 소프트웨어적인 방법으로 수행됩니다, 이는 느린 연산속력의 주 원인입니다)

x87 FPU 는 80486이 출시되기 전까지 프로세서명은 8087, 80287 식으로 출시되었으며 80487 이 마지막으로 분리되어 생산된 FPU 프로세서입니다. (80486 에서 이미 FPU 를 포함하고 있었지만 확장를 위하여 80487이 출시되었습니다)

이전 FPU 연산 시스템과의 호환을 위해 현재까지 FPU 연산들은 CPU와 독립된 처리로 규정을 정하고 있습니다. (대표적인 명령으로 FINIT, FWAIT 등이 있습니다)

II. FPU 의 역할 범위

FPU 는 일반 부동소수점연산뿐만 아니라 루트, 삼각함수 연산을 자체적으로 지원합니다.

즉 대부분의 수학적 프로그래밍에서 FPU 를 통하여 간략화된 연산을 수행할 수 있습니다. (모든 삼각함수 연산은 라디안 값으로 계산합니다)

III. MMX 와 x87 FPU

x87 FPU 와 MMX 는 밀접한 연관성을 가지고 있습니다. x87 FPU 의 레지스터인 ST 와 MMX 의 레지스터인 MM 레지스터는 각각 80비트, 64비트입니다. MM0 은 ST(0) 의 하위 64비트이며, 다른 레지스터 역시 동일합니다. (0~7 총 8개의 레지스터가 존재합니다)

IV. FPU 의 구조

FPU는 R0~R7(ST(0)~ST(7)) 까지 총 8개의 레지스터를 가집니다. 각 레지스터는 80비트이며, 엑세스시에는 스택의 개념을 사용합니다.

(FLD, FSTP 명령 등)

만약

FLD 1

FLD 2

와 같은 명령이 있다고 하면,

FLD 1을 실행시 1은 ST(0)에 로드되며 두번째 라인의 FLD 2를 실행하게 되면 ST(1)의 내용은 ST(0), ST(0)의 내용은 2가 됩니다. 즉 스택(LIFO)방식으로 I/O 하게됩니다.

V. 기본 연산 명령

FINIT : FPU 를 초기화합니다.

FWAIT : FPU 가 연산을 완료할때까지 기다립니다.

FLD : 데이터를 로드합니다. (ex: fld dword ptr [a])

FST : 데이터를 저장합니다. / 저장시 기존 레지스터의 내용은 그대로 유지됩니다 (ex: fstp dword ptr [a])

FSTP : 데이터를 저장합니다. / 저장시 기존 레지스터의 내용을 pop 합니다 (ex: fstp dword ptr [a])

F*** : ADD는 덧셈, SUB는 뺄셈, MUL은 곱셈, DIV 는 나눗셈 연산을 실행합니다. (ex: fadd dword ptr [a] 또는 fadd dword ptr st(number), st(0))

F***P :  F***와 동일하나, 연산을 실행 후 pop 합니다. (ex: fadd st(number), st(0))

FABS : 절대값을 구합니다. (ex: fabs)

FSQRT : 제곱근을 구합니다. (ex: fsqrt)

FCHS : 부호를 반전합니다. (ex: fchs)

F*** : SIN, COS, PTAN, PATAN 이 있으며, 해당되는 삼각함수의 값을 구합니다. (ex: fsin)

VI. 사용 예제

이곳에 사용된 예제의 어셈블리 코드와 실제 컴파일 이후의 코드는 다를 수 있습니다. (코드 최적화)

FINIT 연산은 생략합니다. (필수적으로 사용할 이유가 없는 경우이므로)

예제에서 모든 연산을 REAL4(IEEE 4바이트 부동소수점형식)을 기준으로 처리합니다. C에서의 double 형(REAL8) 을 사용하려면 dword 부분을 qword 로 바꿔주어야합니다.

Example 1.

 by C ->

  float a = 0.5, b = 0.5, c;

 by Assembly 1 ->

  fld dword ptr [a]

  fadd dword ptr [b]

  fstp dword ptr [c]

 by Assembly 2 ->

  fld dword ptr [a]

  fld dword ptr [b]

  faddp st(1), st(0)

  fstp dword ptr [c]

Example 2.

 sin 0.5 의 값을 구하여 b 라는 변수에 저장합니다. (0.5 라는 값은 변수 a 에 있습니다)

 by Assembly ->

  fld dword ptr [a]

  fsin

  fstp dword ptr [b]




http://cafe.naver.com/ArticleRead.nhn?clubid=10026632&articleid=46899&menuid=106&boardtype=L&page=1

Leave a Reply

Your email address will not be published. Required fields are marked *