;;Program do obliczenia y = a**b.
.586P
.MODEL flat, STDCALL
ExitProcess PROTO :DWORD ; funkcja API Win32
;-------------
_DATA SEGMENT
 stan DB 108 DUP (0) ;; 108 = 7*4 bajty + 8*10 bajtów
 stan2 DB 108 DUP (0) ;; 108 = 7*4 bajty + 8*10 bajtów
 a	REAL10	0.5
 ALIGN	4	; przesuniecie do adresu podzielnego na 4
 b	REAL10	0.25
_DATA ENDS
;------------
_TEXT SEGMENT
start:
 pushfd
 pushad
;;sprawdzanie, czy jest koprocesor
 fsave stan	;stan koprocesora (FPU)
 fwait  ; tylko dla procesora 286 i 386 po każdej instrukcji
 finit	; ustawia Tag Word w "1111111111111111"
 fsave stan2	;stan koprocesora (FPU)
 lea ESI,stan2
 lodsd	; Control Word ==> EAX
 lodsd	; Status Word ==> EAX
 lodsd	; Tag Word ==> EAX
 cmp AX,0FFFFh
 je koproc	; jest koprocesor
 jmp koniec
koproc:
 ;;obliczenie y = a**b
 fld b ; b ładujemy pierwszą, aby b znalazła się w st(1) 
 fld a	; st = a
 fyl2x	; st = st(1)*log2(st) ; x znajduje się w st
 fld st	; przesuwanie x w st(1)
 frndint 	; w st znajduje się cała część x zaokrąglona 
 ; z rozszerzoną precyzją (64 bity)
 fsub st(1), st	; w st(1) ułamek x
 fxch st(1)	; w st ułamek u, w st(1) część całkowita
 f2xm1	; podniesienie 2 do potęgi u i odejmowanie 1
 fld1	; załadowanie 1 na stos
 faddp st(1), st	; w st 2 podniesiona do potęgi ułamka x
 fscale	; ostatnie obliczenie
koniec:
;--- zakończenie procesu ---------
 finit
 frstor stan
 fwait
 popad
 popfd
 ExitProcess, 0
_TEXT ENDS
END start



