Inline Assembler Problem bei Verwendung von Intel Syntax
-
Hallo,
Ich möchte eine C-Funktion die einen reinen Assembler-Body besitzt so übersetzen, dass Sie mit GCC kompiliert werden kann. Mein Problem dabei ist, dass GCC by default AT&T-Syntax für den Inline-Assembler verwendet. Da ich weder Zeit noch Lust dazu habe mir die AT&T Syntax anzueignen habe ich folgendes versucht:
1. Den Compiler-Parameter -masm=intel zu werden (außer merkwürdigen Compiler-Errors hat das nichts gebracht)
2. Den Code so zu übersetzen// MSVC 9.0 char* UpperCase( char* Src, char* Dest ) { __asm { [asm] push esi push edi mov esi, BYTE PTR [ebp+8] ; Src lea edi, BYTE PTR [ebp+12] ; Dest nextchar: lodsb ; load byte from ESI to al cmp al, 0x61 jb done ; below 'a' ? cmp al, 0x7A ja done ; above 'z' ? xor al, 0x20 ; set bit 6 done: stosb cmp [esi], 0 je end loop nextchar end: mov eax, [ebp+12] pop edi pop esi[/asm] } } // GCC char* UpperCase( char* Src, char* Dest ) { asm (".intel_syntax noprefix\n"); asm ("push esi\n"); asm ("push edi\n"); asm ("mov esi, BYTE PTR [ebp+8]\n"); asm ("mov edi, BYTE PTR [ebp+12]\n"); asm ("nextchar:\n"); asm ("lodsb\n"); asm ("cmp al, 0x61\n"); asm ("jb done\n"); asm ("cmp al, 0x7A\n"); asm ("ja done\n"); asm ("xor al, 0x20\n"); asm ("done:\n"); asm ("stosb\n"); asm ("cmp [esi], 0\n"); asm ("je end\n"); asm ("loop nextchar\n"); asm ("end:\n"); asm ("pop edi\n"); asm ("pop esi\n"); asm ("mov eax, [ebp+12]\n"); asm (".att_syntax noprefix"); }
Leider bekomme ich nun immer die Fehlermeldungen:
Error: '%esi' not allowed with 'movb' Error: '%edi' not allowed with 'movb' Warning: using '%al' instead of '%eax'due to 'b' suffix Error: '%esi' not allowed with 'movb' Error: '%edi' not allowed with 'movb' Error: symbol 'nextchar' is already defined Error: symbol 'done' is already defined Error: symbol 'end' is already defined Warning: using '%al' instead of '%eax'due to 'b' suffix
... die ich zwar allesamt nachvollziehen könnte, aber nur WENN ich denn die entsprechenden Instruktionen verwenden WÜRDE.
Ich zähle auf eure UnterstützungIrgendjemand arbeitet doch bestimmt mit GCC^^.
PS:
Es geht hier nicht um den Code. Den kann ich auch in C schreiben, sondern ums Prinzip. Wie verwende ich mit GCC Intel-Syntax?