division und modulo



  • hola leute

    ich hab mal folgende funktion mit dem BCB6 kompiliert.
    auf geschwindigkeit optimiert.

    void my_div(unsigned int x, unsigned int y, unsigned int &z, unsigned int &r)
    {
       z = x / y;
       r = y % y;
    }
    

    danach hab ich die .onj datei disassembliert. da kam folgendes raus:

    push	ebp
    		mov	ebp, esp
    		mov	ecx, [ebp+arg_4]
    		mov	eax, [ebp+arg_0]
    		xor	edx, edx
    		div	ecx
    		mov	edx, [ebp+arg_8]
    		mov	[edx], eax
    		mov	eax, ecx
    		xor	edx, edx
    		div	ecx
    		mov	eax, [ebp+arg_C]
    		mov	[eax], edx
    		pop	ebp
    		retn
    

    waere es nicht besser wenn er aehnliches wie folgendes machen wuerde?

    push	ebp
    		mov	ebp, esp
    		mov	ecx, [ebp+arg_4]
    		mov	eax, [ebp+arg_0]
    		xor	edx, edx
    		div	ecx
    		mov	edx, [ebp+arg_8]
    		mov	eax, [ebp+arg_C]
    		pop	ebp
    		retn
    

    is das eventuell beim intel oder anderen compiler anders ? koennte das mal jemand von euch
    probieren ?

    cermy

    Meep Meep



  • ...

    Bevor du dir ueber Optimierungsstrategien verscheidener Compiler zu verschiedenen CPUs den Kopf zerbrichst, wuerde ich vorschlagen, dass du dir nochmal genau ueberlegst, was deine Codes eigentlich machen, bzw. machen sollen.
    So weiss ich zumindest nicht wirklich, worauf du hinaus willst. Ich kann's hoechstens erahnen. 😉



  • hola

    jop war absoluter bloedsinn.
    wollte es eigendlich anders machen.
    grundlage is eine binaerzahl als string darzustellen.

    also:

    void my_div(unsigned int &x, unsigned int y, unsigned int &r)
    {
       r = x % y;
       x /= y;
    }
    

    bin grad schon im bett gelegen, als mir ploetzlich in den kopf schoss, welchen
    bloedsinn ich da gepostet hatte.

    mal morgen gucken was mein BCB daraus macht. koennt ihr trotzdem mal gucken
    was euer kompiler daraus macht ?

    guats naechtle

    Meep Meep



  • hola

    hab jetzt die funktion von meinem letzten post kompiliert und deassembliert.

    push	ebp
    		mov	ebp, esp
    		push	ebx
    		push	esi
    		mov	ebx, [ebp+arg_0]
    		mov	esi, [ebp+arg_4]
    		xor	edx, edx
    		mov	ecx, [ebp+arg_8]
    		mov	eax, [ebx]
    		div	esi
    		mov	[ecx], edx
    		xor	edx, edx
    		mov	eax, [ebx]
    		div	esi
    		mov	[ebx], eax
    		pop	esi
    		pop	ebx
    		pop	ebp
    		retn
    

    macht also 2 divisionen.

    heisst es jetzt eigendlich deassembliert oder disassembliert ?

    Meep Meep



  • Meep Meep schrieb:

    [...]macht also 2 divisionen.

    Was schliessen wir daraus?
    Dein Compiler optimiert nicht immer gut.

    Meep Meep schrieb:

    heisst es jetzt eigendlich deassembliert oder disassembliert ?

    Ziemlich eindeutiges Ergebnis wuerde ich meinen. 😉



  • r = y % y da kommt immer Null raus und er muss auch zweimal dividieren wenn das div und modulo nicht bezüglich der gleichen Argumente ist


Anmelden zum Antworten