A pΘlda program EXE-je !


{$N+,G+}
program
FPU_Jxx_functions;
 
function
KisebbOp1Op2(var Operandus1, Operandus2: Single): Byte; Assembler;
{Ha a fⁿggvΘny visszatΘrΘsi ΘrtΘke:
- 1 akkor igaz az-az kisepp Op1, mint Op2, ha
- 0 akkor szigor·an nagyobb, Θs ha
- 2 akkor egyenl⌠ !}

asm

 push es {a regiszterek elmentΘse a stack-en !}
 push di {a regiszterek elmentΘse a stack-en !}
 push ds {a regiszterek elmentΘse a stack-en !}
 push si {a regiszterek elmentΘse a stack-en !}
 
 les di, Operandus1 {Mivel a Op1 Single vßltoz≤ cφm szerint volt ßtadva }
 lds si, Operandus2 {csak bele mozgatjuk a 'mutat≤' regiszterkbe ezt a cφmet}
 fld DWord Ptr es:[di] {Az ST(0)-ba mßsoljuk az Operandus1 vßltoz≤t}
 fld DWord Ptr ds:[si] {Az ST(0)-ba mßsoljuk az Operandus2 vßltoz≤t, Θs ST(1)=ST(0)}
 
 fcomp {ElvΘgezzⁿk az ÷sszehasonlφtßst: FCOMP ST(0), ST(1), pop}
 fstsw ax {AX regiszterbe elmentjⁿk az FPU ßllapotsz≤t}
 sahf {Az als≤ (SZAPC) flag-bit-ek beßllφtßsa AH regiszterb⌠l}
 
 jb @Kisebb {Miutßn beßllφtottuk a flag-eket azutßn hasznßlhatjuk a }
 jg @Nagyobb { megszokott ugr≤ Jxx utasφtßsokat, hisz a flag-ban mßr }
 je @Egyenlo { ugyanolyan m≤don vannak a bit-ek felkapcsolva, mintha }
{ a CMP X, Y utasφtßst hasznßltuk volna ! }
 
 mov al, 255
{Hiba lekezelΘs, val≤szφn√leg nem hφvodik meg, mert kΘt szßm }
 jmp @Exit { vagy kisebb, nagyobb, vagy egyenl⌠. A 6 Byte plussz meg }
{ nem a vilßg ! }
@Kisebb:
{Ha a vizsgßlat sorßn az ST(1) (Op1) Kisebb volt, mint ST(0) }
 mov al, 1 { (Op2), akkor ide ugrik a vezΘrlΘs, Θs a fⁿggvΘny visszatΘrΘsi-}
 jmp @Exit {ΘrtΘke 1 φgy a kΘs⌠bbiekben eltudjuk d÷nteni, hogy mi is volt !}
 
@Nagyobb:
{Ha a vizsgßlat sorßn az ST(1) (Op1) Nagyobb volt, mint ST(0) }
 mov al, 0 { (Op2), akkor ide ugrik a vezΘrlΘs, Θs a fⁿggvΘny visszatΘrΘsi-}
 jmp @Exit {ΘrtΘke 0 φgy a kΘs⌠bbiekben eltudjuk d÷nteni, hogy mi is volt !}
 
@Egyenlo:
{Ha a vizsgßlat sorßn az ST(1) (Op1) Egyenl⌠ volt, mint ST(0) }
 mov al, 2 { (Op2), akkor ide ugrik a vezΘrlΘs, Θs a fⁿggvΘny visszatΘrΘsi-}
{ΘrtΘke 2 φgy a kΘs⌠bbiekben eltudjuk d÷nteni, hogy mi is volt !}
 
@Exit:
{A kilΘpΘshez ide ugrik a vezΘrlΘs. }
 pop si {A regiszterek visszaßllφtßsa a stack-r⌠l !}
 pop ds {A regiszterek visszaßllφtßsa a stack-r⌠l !}
 pop di {A regiszterek visszaßllφtßsa a stack-r⌠l !}
 pop es {A regiszterek visszaßllφtßsa a stack-r⌠l !}
end;

 
var
Sing1, Sing2: Single;
BEGIN

 Sing1:=3;
 Sing2:=2;
 case
KisebbOp1Op2(Sing1, Sing2) of
  0:
WriteLn(Sing1:1:3, ' kisebb, mint ', Sing2:1:3);
  1:
WriteLn(Sing1:1:3, ' szigor·an nagyobb, mint ', Sing2:1:3);
  2:
WriteLn(Sing1:1:3, ' egyenl⌠ ', Sing2:1:3);
  else
WriteLn('hiba a fⁿggvΘny meghφvßsa sorßn: KisebbOp1Op2() !');
 end;
END.

 

Vissza