CPU 와 FPU 는 서로 다른 CPU 인데 현재에 들어서는 CPU 안에FPU가 탑재 되어 있는 방식이다
즉 CPU 안에 레지스터공간(EAX, EDX, 등등...)이 따로 존재 하듯이 FPU 안에도 FPU 만의 레지스터가 따로 존재한다(ST0~ST7 , c0, c2, c3 등등....)
CPU에서 점프를 할때 JZ 등으로 바로 점프 할 수 있으나 FPU 는 float 를 계산하기 위한 전용 처리 장치이기 때문에
float 연산은 FPU 에서 처리 하고 이에 대한 비교 연산이 FPU 내의 C0 , C2, C3 플래그에 기록 되게 되는데 이것을
CPU 의 상태 플래그로 넘겨 줘야 CPU에서 점프처리가 가능하게 된다
과정
1. fcmp 로 float 값을 비교
2. fstsw ax 로 fpu 상태 레지스터 값을 ax로 복사한다
3. sahf 로 ah 를 상태 레지스터로 (EFLAGS(SF:ZF:0:AF:0:PF:1:CF) = AH;)
4. 점프(점프는 unsigned 와 패리티 비트 관련된 걸로 할 수 있는데 c0, c2, c3 값이 세팅 되는 것이 부모 있는 수치에 관련된 플레그로 세팅되지 않기 때문)
: FPU 는 캐리처리 없이 연산 됨으로
SAHF | Load SF, ZF, AF, PF, and CF from AH into EFLAGS register. |
이미지로 간략히 나타내면 다음 처럼 그릴 수 있다
축약 과정
원래는 위 처럼 동작 하지만 이를 간소화ㅎ여 실행 할 수 있는 명령어 FCOMI 가 있다
1. fcmp 로 float 값을 비교
2. FCOMI ST(0), ST(1) 이 명령어가 FPU 레지스터 플래그 들을 CPU 상태 레지스터플래그로 옮겨주는 작업도 처리해준다, 펜티업 프로 이상에서 작동
4. 점프(점프는 unsigned 와 패리티 비트 관련된 걸로 할 수 있는데 c0, c2, c3 값이 세팅 되는 것이 부모 있는 수치에 관련된 플레그로 세팅되지 않기 때문)
: FPU 는 캐리처리 없이 연산 됨으로
'프로그래밍(Programming) > 어셈블리어(asm)' 카테고리의 다른 글
C언어에서의 __asm 과 어셈블리 로직 증감 구문 비교 (0) | 2018.02.13 |
---|---|
C언어에서의 cmp 와 jp(jump) 를 이용한 반복문 (0) | 2018.02.13 |
x86 명령어 셋 레퍼런스 (0) | 2017.03.04 |
[ENTER numbytes, nestinglevel 의 메모리 단에서의 확인] 이전전... ebp 값들로 변수 값을 찾는다 (0) | 2017.03.03 |
VisualStudio2015 어셈블러 하이라이트 설정 (0) | 2017.03.01 |