wieder gcc inline assembler



  • mein gcc inline asm geht einfach nicht. sobald ich ein register in die clobbert liste setz sagt mit der gcc:

    can't find a register in class `AREG' while reloading `asm'

    das gibt s doch nicht. hab jetz wirklich genug im inet gelesen. wieso kennt der eax nicht und auch die anderen nicht?
    gcc is version 3.2.2.



  • Hellsehen kann hier keiner. Poste mal den Code, der nicht funktioniert.



  • es ist komplett unabhängig vom code.

    class cpu {
      protected:
        unsigned char _control_number;
    
      public:
        inline cpu(void) {
          _control_number = 0;
          asm (
            "cpuid" :
            "=a"(_control_number) :
            "a"(0) :
            "%eax", "%ebx", "%ecx", "%edx"
          );
        }
    
        inline const unsigned char control_number(void) { return control_number; }
    };
    
    ein % vor den registern in der cloppered list ändert nichts. es geht mit und ohne nicht. und %% geht gar nicht.
    


  • Klappt vielleicht "a" ?



  • nein auch nicht. sollte es auch nicht. laut tuts sollten da die register der form eax oder %eax drin stehen. da sind sich die tuts nicht einig.

    unknown register name `a' in `asm'

    das ist die fehlermelung mit "a" drin.



  • Habs. Nimm eax einfach aus der clobbered list raus. Aus der angabe "=a" weiß der gcc schon, dass das Register geplättet wird.

    Vermutlich hält der gcc intern ne art "free-list" und nimmt alle geänderten register raus. Wenn du dann in der clobbered list nach eax fragst, ists nicht mehr in der liste, da die "=a"-Zeile eas schon draus entfernt hat.

    [ Dieser Beitrag wurde am 09.05.2003 um 23:13 Uhr von TriPhoenix editiert. ]



  • es sieht aus, als dass das die lösung des problems ist.
    danke


Anmelden zum Antworten