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