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