반응형


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 는 캐리처리 없이 연산 됨으로



SAHFLoad 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 는 캐리처리 없이 연산 됨으로




반응형

+ Recent posts