{$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.