일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 자원부족
- 오블완
- table not found
- pytest
- tolerated
- 겨울 부산
- VARCHAR (1)
- 헥사고날아키텍처 #육각형아키텍처 #유스케이스
- kotlin
- mp4fpsmod
- PersistenceContext
- Value too long for column
- terminal
- JanusWebRTC
- taint
- 티스토리챌린지
- 달인막창
- vfr video
- k8s #kubernetes #쿠버네티스
- 코루틴 빌더
- PytestPluginManager
- Spring Batch
- 깡돼후
- JanusGateway
- python
- JanusWebRTCGateway
- JanusWebRTCServer
- 코루틴 컨텍스트
- preemption #
- 개성국밥
너와 나의 스토리
어셈블리 - FPU(부동 소수점 유닛) 본문
● 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레지스터의 스택들을 화면에 출력
'Programming Language > Assembly' 카테고리의 다른 글
어셈블리 - FPU 예제 (실습 코드) (0) | 2019.06.07 |
---|---|
어셈블리 - push&pop 명령어 / USES Operator (0) | 2019.06.03 |
어셈블리 - JMP and LOOP Instructions (0) | 2019.06.03 |
어셈블리(ch5) - 라이브러리 프로시저 호출 (Linking to an External Library) (0) | 2019.06.03 |
어셈블리 - 지역 변수/ 프로시저 매개변수 넘기기/ 프로시저 프로토타입 (0) | 2019.06.01 |