Hallo, ich wollte mal ebend fragen, ob mir jemand sagen kann, wie ich beim AVR GCC in assembler den Stackpointer initialisieren kann. Unter AVR Studio habe ich es mit LOW(RAMEND) und HIGH(RAMEND) gemacht. Das funktioniert hier leider nicht. Rausgefunden habe ich bereits, dass man statt .def ; #def schreibt. Gleiches gilt für equ. Kann mir vielleicht jemand helfen? Eingefüht habe ich bisher: #include <avr/io.h> Sonst nichts. Vielen Dank!
>Hallo, ich wollte mal ebend fragen, ob mir jemand sagen kann, wie ich >beim AVR GCC in assembler den Stackpointer initialisieren kann. Das macht der schon für dich. Das musst du nicht in Assembler tun.
Hallo, ja, ich wollte allerdings mein Programm komplett in assembler schreiben!
Und weiß keiner wie man das unter AVR GCC macht? ldi temp, _SP_L_ out SPL, temp ldi temp, _SP_H_ out SPH, temp So funktionierts nicht :(
Ja, wie gut das ich linux benutze ;) Ich habe halt nur ein makefile und den AVR GCC auf dem pc. Ausserdem Ubuntu. SONST NIX! Der Code läuft unter AVR Studio einwandfrei! Ich brauch halt einfach mal die info wie man den stackpointer in ASM Initialisiert bzw. wie die Oberste adresse des Stackpointers heisst...
avr-gcc mach folgendes:
1 | a4e: cf ef ldi r28, 0xFF ; 255 |
2 | a50: d4 e0 ldi r29, 0x04 ; 4 |
3 | a52: de bf out 0x3e, r29 ; 62 |
4 | a54: cd bf out 0x3d, r28 ; 61 |
RAMEND ist für den ATmega168 0x4ff, SP liegt an 0x3d. Die Adressen in den Makros der avr/io.h sind die RAM-Adressen der SFRs. Für den Zugriff per IN/OUT/SBI/CBI/SBIS/SBIC muss also ein Offset von 0x20 brachtet werden.
>Ich brauch halt einfach mal die info wie man den stackpointer in ASM >Initialisiert bzw. wie die Oberste adresse des Stackpointers heisst... Aus iom168.h #define RAMEND 0x4FF Also genauso wie beim Studio. Man sollte im makefile vieleicht mal den verwendeten Prozessor mit eintragen ?
Ok, und was muss ich jetzt genau eintippen, damit ich den mist initialisiert bekomme? Also für SPL und SPH. Oder macht man das unter dem AVR GCC auch anders?
dude wrote: > Ich brauch halt einfach mal die info wie man den stackpointer in ASM > Initialisiert bzw. wie die Oberste adresse des Stackpointers heisst... Nein, brauchst du eigentlich nicht. Auch wenn dein Projekt nur aus Assembler-Sourcen besteht, wird der C-Startup-Code trotzdem dazu gelinkt, in dem der Stackpointer initialisiert wird. Du kannst natürlich mit einem eigenen Linker-Script arbeiten, aber das einfachste wäre es, du nennst deinen Asm-Einsprung "main" und nutzt einfach den C-Startup-Code.
Den SP am oberen RAM-Ende initialisieren macht (u.a.) der 168er beim Reset alleine. Das braucht man nicht programmieren. Mal ganz nebenbei.
Und du darfst das Assembler-Gerümpel nicht in .c Dateien schreiben. Schon klar, oder?
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.