Opdracht digitale technieken schrijven assembler functies samen met c++ code

Status
Niet open voor verdere reacties.

Stephane

Gebruiker
Lid geworden
21 apr 2007
Berichten
10
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?

Code:
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);
}

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
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan