관리 메뉴

너와 나의 스토리

어셈블리 - FPU(부동 소수점 유닛) 본문

Programming Language/Assembly

어셈블리 - FPU(부동 소수점 유닛)

노는게제일좋아! 2019. 6. 7. 20:27
반응형

● FPU 피연산자 규칙

1) 0~2개의 피연산자가 올 수 있다

2) 즉시값은 피연산자로 올 수 없다

   ㄴ 메모리나 FPU레지스터만 가능

3) 범용 레지스터는 사용할 수 없다. (eax,ebx이런 것)

4) 정수 피연산자의 메모리에서 FPU로 적재된다. 

5) 만약 두 개의 피연산자를 가지면 하나는 무조건 FPU레지스터이여야 한다.

 

 

● 데이터 타입

1) REAL4: 32비트 (4byte)   <- m32fp

2) REAL8: 64비트 (8byte)   <- m64fp

3) REAL10: 80비트 (10byte)  <- m80fp

 

 

● 명령어

FLD 

형태: FLD src

동작: src 값을 stack에 push한다

기타 연산

FLD1: stack에 1을 push한다

FLDPI: stack에 pi값을 push한다

FLDZ: stack에 0을 push한다

 

- FST

형태: FST src

동작: ST(0)의 값을 src에 저장 ( ST(0) = stack의 top )

 

- FSTP

형태: FSTP src

동작: ST(0) 값을 src에 저장하고 stack에서 pop한다.

FSTP ST(0)하면 그냥 pop만 함

; FLD / FSTP 예제

.data 
dbone real8 123.45 
dbtwo real8 67.89

.code
fld dbone 		 ; ST(0)=dbone
fld dbtwo 		 ; ST(1)=dbone , ST(0)=dbtwo
call writefloat 	   ; dbtwo 출력됨
call crlf
fstp st(0)    		; 그냥 pop   
call writefloat 	 ; dbone 출력됨

 

- FCHS 

형태: FCHS (피연산자 없음)

동작: ST(0)의 부호를 바꾼다

 

- FABS

형태: FABS (피연산자 없음)

동작: ST(0) 값을 양수로 바꿔줌 (절대값 씌움)

 

- FSQRT

형태: FSQRT (피연산자 없음)

동작: ST(0)값에 루트를 씌움

 

 

* 산술 연산

- FADD

1) 형태: FADD (피연산자 없음)

   동작: ST(1) = ST(1)+ST(0) , ST(0) pop됨

 

2) 형태: FADD m32/64fp

   동작: ST(0) = ST(0) + m32/64fp

 

3) 형태: FADD ST(i),ST(j)

    동작: ST(i) = ST(i)+ST(j)

 

;FADD 예시
.data
dbone real4 123.45
dbtwo real4 67.89
dbtmp real8 10.0

.code
fld dbone  ; ST(0)=dbone
fld dbtwo  ; ST(1)=dbone , ST(0)=dbtwo
;fadd dbtmp  ; ST(0)=ST(0)+dbtmp
;call writefloat

fadd st(1),st(0)
fstp st(0)
call writefloat

 

- FADDP

1) 형태: FADDP (피연산자 없음)

   동작: ST(1) = ST(1)+ST(0)  , ST(0) pop됨

 

2) 형태: FADD ST(i),ST(0)

    동작: ST(i) = ST(i)+ST(0), ST(0)은 pop됨

 

 

- FSUB

1) 형태: FSUB (피연산자 없음)

   동작: ST(1) = ST(1)-ST(0) , ST(0) pop됨

 

2) 형태: FSUB m32/64fp

   동작: ST(0) = ST(0) - m32/64fp

 

3) 형태: FSUB ST(i),ST(j)

    동작: ST(i) = ST(i)-ST(j)

 

- FSUBP

1) 형태: FSUBP (피연산자 없음)

   동작: ST(1) = ST(1)-ST(0)  , ST(0) pop됨

 

2) 형태: FSUBP ST(i),ST(0)

    동작: ST(i) = ST(i)-ST(0), ST(0)은 pop됨

 

 

- FMUL 

1) 형태: FMUL (피연산자 없음)

   동작: ST(1)=ST(1)*ST(0), ST(0) pop

 

2) 형태: FMUL m32/64fp

   동작: ST(0) = ST(0) * m32/64fp    

 

3) 형태: FMUL ST(i), ST(j)

   동작: ST(i) = ST(i)*ST(j)

 

- FMULP

1) 형태: FMULP (피연산자 없음)

   동작: ST(1)=ST(1)*ST(0), ST(0) pop

 

2) 형태: FMULP ST(i), ST(0)

   동작: ST(i) = ST(i)*ST(0), ST(0) pop

 

- FDIV 

1) 형태: FDIV (피연산자 없음)

   동작: ST(1)=ST(1)/ST(0), ST(0) pop

 

2) 형태: FDIV m32/64fp

   동작: ST(0) = ST(0) / m32/64fp

 

3) 형태: FDIV ST(i), ST(j)

   동작: ST(i) = ST(i)/ST(j)

 

FDIVP

1) 형태: FDIVP (피연산자 없음)

   동작: ST(1)=ST(1)/ST(0), ST(0) pop

 

2) 형태: FDIVP ST(i), ST(0)

   동작: ST(i) = ST(i)/ST(0), ST(0) pop

 

 

* 비교 연산자

- FCOM

1) 형태: FCOM 

   동작: ST(0)과 ST(1) 비교

 

2) 형태: FCOM m32/64fp/st(i)

    동작: ST(0)과 피연산자와 비교

 

- FCOMI

형태: FCOMI ST(0), ST(i)

동작: ST(0)과 ST(i) 비교

ㄴ> ja 등을 이용해서 jump 가능

 

 

- finit 

FPU 부분을 초기

 

  Irvine32 library

- ReadFloat

   실수를 입력받아 ST(0)에 저장

- WriteFloat

   ST(0)값 출력

- ShowFPUStack

   FPU레지스터의 스택들을 화면에 출력

반응형
Comments