Inline Assemlber - xor Version



  • Hallo!

    Ich bräuchte einmal Hilfe bei der Implementierung einer C Funktion in Inline Assembler (VC++).

    Für folgende C Funktion bräuchte ich den Assemblercode:

    inline void __fastcall xor_bytes (unsigned char *pDest, unsigned char *pSrc, size_t len)
    {
        while(len--)
            *pDest++ ^= *pSrc++;
    }
    

    P.S.: Ich kenne mich leider gar nicht in Assembler aus. Daher wäre es auch sinnvoll wenn ich die Funktionssignatur so "übernehmen" könnte.



  • Welcher Assembler, welcher Compiler, welche CPU usw.?

    EDIT: Und warum in Assembler?



  • Visual C++ Inline Assembler, Visual C++, x86

    Weil das dadurch schneller wird.


  • Mod

    HaJo, schrieb:

    Weil das dadurch schneller wird.

    nein, nicht in diesem fall (inline funktionen können keine aufrufkonvention haben (weil eben dieser aufruf beim inlinen entfällt - aus diesem grunde ist inline assembler in inline funktionen in vc++ wegen der beschränkungen des inline assemblers kaum nützlich)
    man könnte dieses problem zwar durch ein macro z.T. umgehen, das ist allerdings sehr unschön und fehlerträchtig. im übrigen hat valarray<unsigned char> diese funktion schon.

    du solltest über etwas konventionelleres, wie loop unrolling, nachdenken.


  • Mod

    das könnte z.b. so aussehen:

    inline void xor_bytes(unsigned char *pDest, unsigned char *pSrc, size_t len)
    {
    	while( len && ( size_t( pDest ) & ( 4 * sizeof( unsigned int ) - 1 ) ) )
    	{
    		*pDest++ ^= *pSrc++;
    		++len;
    	}
    	size_t len2 = len / ( 4 * sizeof( unsigned int ) );
    	while( len2-- )
    	{
    		*((unsigned int*)pDest)++ ^= *((unsigned int*)pSrc)++;
    		*((unsigned int*)pDest)++ ^= *((unsigned int*)pSrc)++;
    		*((unsigned int*)pDest)++ ^= *((unsigned int*)pSrc)++;
    		*((unsigned int*)pDest)++ ^= *((unsigned int*)pSrc)++;
    	}
    	len &= ( 4 * sizeof( unsigned int ) - 1 );
    	while( len-- ) *pDest++ ^= *pSrc++;
    }
    

    ob sich der aufwand überhaupt lohnt, hängt nat. auch von der typischen länge ab.


Anmelden zum Antworten