Opdracht digitale technieken schrijven assembler functies samen met c++ code
Geplaatst: wo 26 dec 2007, 10:26
Hallo iedereen
We hebben een opdracht gehad om functies te schrijven in assembler, bepaalde functies werken al maar deze functies werken echt niet heb echt verkeerde resultaten en heb al erg weinig kennis van die assembler want was ook veel zelfstudie met die FPU 8087 processorset.
Op deze functies namelijk ArcSin(), ArcCos(), TanX(), SH(x), CH(x) en de functies voor Exp2(x) geven zelfs verkeerde resultaten, en heb al een 4 tal uur zitten zoeken op die fout maar kan ze helaas niet vinden, we moeten wel dit project ingeven en we mogen van internet en forums gebruikmaken. Heeft hier iemand assembler kennis en mij kan helpen wat hier fout gaat in die stukjes code?
Hier zijn de codes die helemaal niet werken:
Is niet de bedoeling mijn huiswerk te maken want heb dit wel zelf allemaal geschreven en gehaald uit de wiskunde maar het gaat mis als ik dat uitvoer met de computer waarom daar stel ik wel de vraag om
We hebben een opdracht gehad om functies te schrijven in assembler, bepaalde functies werken al maar deze functies werken echt niet heb echt verkeerde resultaten en heb al erg weinig kennis van die assembler want was ook veel zelfstudie met die FPU 8087 processorset.
Op deze functies namelijk ArcSin(), ArcCos(), TanX(), SH(x), CH(x) en de functies voor Exp2(x) geven zelfs verkeerde resultaten, en heb al een 4 tal uur zitten zoeken op die fout maar kan ze helaas niet vinden, we moeten wel dit project ingeven en we mogen van internet en forums gebruikmaken. Heeft hier iemand assembler kennis en mij kan helpen wat hier fout gaat in die stukjes code?
Hier zijn de codes die helemaal niet werken:
Code: Selecteer alles
extern double Exp2(double x)
{
double temp = 0.0;
short MaskedCW;
short SaveCW;
_asm
{
FLD x
; waarde van x ophalen
FSTCW MaskedCW
;
OR BYTE PTR MaskedCW + 1, 1100b;
FLDCW MaskedCW
FLD ST(0)
FLD ST(0)
FRNDINT
; bereken gehele deel
FXCH
; verwissel de int waarden
FSUB ST(0), ST(1)
; bereken frac deel
F2XM1
; bereken 2 ^ frac(x) - 1
FLD1
FADD
; bereken 2 ^ frac(x)
FXCH
; Ophalen van het gehele deel
FLD1
; bereken 1 * 2 ^ int(x)
FSCALE
FSTP ST(1)
; haal de waarde van de stack ST(1) op
FMUL
; bereken 2 ^ int(x) * 2 ^ frac(x)
FLDCW SaveCW
; herstel de afrondingsmode
FST temp
FNINIT
}
return(temp);
}
// Werkt niet rond de waarde af
extern double TanX(double x)
{
double temp = 0.0;
double result = Deg2Rad(x);
_asm
{
FLD result ; sla de terugkeerwaarde op op de TOS
FPTAN ; bereken de Tan(x)
FST temp ; sla de terugkeerwaarde op op de TOS
FNINIT
}
return(temp);
}
extern double ArcSin(double x)
{
double temp = 0.0;
// double result = Deg2Rad(x);
_asm
{
FINIT
FLD x
FST ST(1)
FMUL
FST ST(1)
FLD1
FSUBR
FSQRT
FDIVR x
FST ST(1)
FLD1
; bereken de ArcTan
FPATAN
FST temp
; opslaan in de temp
}
return(temp);
}
extern double ArcCos(double x)
{
double temp = 0.0;
double result = Deg2Rad(x);
_asm
{
FLD result
FMUL
; berekend x * x
FLD ST(0)
; x * x op de TOS
FLD1
; bereken 1 - x^2
FSUBR
FDIVR
; bereken (1 - x^2) / (x^2)
FSQRT
; bereken sqrt(1 - x^2) / (x^2)
FLD1
; bereken de ArcTan
FPATAN
FST temp
; opslaan in de temp
FNINIT
}
return(temp);
}