Hallo! Ich schreibe gerade meine ersten Zeilen in Assembler für einen ATMEGA32. Mein Problem ist vermutlich aber eher allgemeiner Natur, wohl ein Verständnisproblem... Mein Programm sieht ungefähr so aus: .include "m32def.inc" .def reg0 r0 .def reg16 r16 ldi reg16, 0b00000000 ; das geht ldi reg0, 0b00000000 ; das geht nicht Ich verstehe nun überhaupt nicht, warum die letzte Zeile nicht funktioniert. Compiler: "error : Illegal argument type or count" Bei den Register 1-15 sieht es genauso aus. Danke schon mal Grüße Tobi
Wenn man Assembler programmiert, sollte man sich auch die Befehlsreferenz des Prozessors auf den Schreibtisch legen und dort mal reingucken... LDI akzeptiert halt nur Register 16...31.
weil der Programmspeicher nur 16bit breit ist, demzufolge kann man nur eine begrenzte Anzahl von Befehlen mithilfe dieser 16 bit codieren. Und da dass Grundprinzip davon ausgeht, mit einem Zugriff auf den Programmspeicher den kompletten Befehl zu lesen (ein paar Ausnahmen gibts bei den Mega-Typen) muss also der Befehl (ldi), die Konstante selbst (8bit) und die Zieladresse in 16bit untergebracht werden. Und da dass nicht passt, hat man die Zieladresse um ein Bt gekürzt, statt 5bit für alle 32 Register sind es nur noch 4 bit, und das reicht eben nur für 16 Zieladressen. Dasselbe Prinzip findest du bei allen anderen immediate-Befehlen auch (andi, ori, subi).
Hallo Tobi, das hängt irgendwie mit der Architektur des Prozessors zusammen, genaues weiss ich leider auch nicht. <.include "m32def.inc" <.def reg0 r0 <.def reg16 r16 <ldi reg16, 0b00000000 ; das geht <ldi reg0, 0b00000000 ; das geht nicht aber: .include "m32def.inc" .def reg0 r0 .def reg16 r16 ldi reg16, 0b00000000 ; das geht mov reg0,reg16 ; das geht Bei r0 bis r15 muss man den Umweg über r16 bis r25 gehen. Allerdings sollte man r0 für die Benutzung mit dem Z-Register reservieren. Denn wenn man mit Hilfe des Z-Registers aus einer Tabelle einen Wert liest, dann steht dieser Wert automatisch im Register r0. Gruß, Arno
Danke crazy horse, wieder was gelernt. Ich wußte zwar das man nicht alle Befehle mit r0 bis r15 benutzen kann, aber nicht warum das so ist. Gruß, Arno
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.