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);
    }
    

Anmelden zum Antworten