Keine Labels im inline ASM?
-
Mein Compiler meldet mir immer "error C2415: Ungueltiger Operandentyp" wenn ich eine Datei mit folgender Funktion kompiliere:
void PrintAnotherShit() { DWORD db; _asm{ mov db, 0xFFF0 xor db, db jz iszero jmp end iszero: call NotMessage end: } printf("%d", db); }
darf man im inline Assembler von VC++ keine Labels angeben?
-
Doch, sonst würde inline-ASM doch keinen wirklichen Sinn machen... In welcher Zeile wird der Fehler denn gemeldet...?
Ein Beispiel:
int main(void) { __asm { jmp test ; sollte gehen mov eax, 01h ; irgendein Code... test: ; __asm label jmp test2 ; sollte auch gehen } int hallo = 0; TeSt2: return 0; }
Der einzige Unterschied ist: jmp kann case-insensitive zu Labels springen und goto case-sensitive.
-
Der Compiler meldet den Fehler in der Zeile:
jz iszero
der Fehler: error C2415: Ungueltiger Operandentyp
dabei ist das ein ganz einfaches "Jump if zero flag is set".
-
Probier es doch mal mit:
cmp db, 0 je iszero
Müsste eigentlich auch klappen
-
das funktioniert problemlos. Aber warum nicht mit dem Zero Flag? Muss doch gehen, sonst kann man ja die Hälfte des Inline Assemblers knicken...
-
Ich hab den Fehler gefunden, er lag bei xor db, db
man darf im Inline ASM xor nicht auf Speicherstellen anwenden. Man muss den Wert erst ins EAX register o.Ä. schieben. Hab das Ganze jetzt so gemacht:void PrintAnotherShit() { DWORD db; __asm{ mov db, 0xFFF0 mov eax, db xor eax, eax jz iszero jmp end iszero: call NotMessage end: } printf("%d", db); }