Hallo Leute ich verstehe nicht wie mein Assemblerprogramm sich im Programmspeicher "verteilt". Bei org 0 (reset vector 000h) fängt mein Programm an und von dort springe ich mit goto zu einer marke aber wo ist dann das Programm im Speicher??? Oder sagen wir mal ich habe einen Interrupt bei org 4 und springe von da zu der interruptserviceroutine aber wo ist diese im Speicher und wovon hängt das ab? Ich habe noch mehr Fragen aber vielleicht erledigen sich diese wenn ich das geblikt habe. Würde mich echt über einwenig Licht in der Sache freuen. MfG Iwan
Iwan Ne schrieb: > Bei org 0 (reset vector 000h) fängt mein Programm an und von dort > springe ich mit goto zu einer marke aber wo ist dann das Programm im > Speicher??? Genau an der Stelle, an der die Marke steht. > Oder sagen wir mal ich habe einen Interrupt bei org 4 und springe von da > zu der interruptserviceroutine aber wo ist diese im Speicher und wovon > hängt das ab? Davon, in welcher Reihenfolge du deinen Code anordnest.
> Bei org 0 (reset vector 000h) fängt mein Programm an und von dort > springe ich mit goto zu einer marke aber wo ist dann das Programm im > Speicher??? dahinter, wogenau ist doch egal. Es gibt ja nur den einen Speicher, er wird normalerweise immer der Reihenfolge nach gefüllt, mit dem Org (was man nicht unbedingt braucht!) kanst du bloss eine stelle vorgeben. Man könnte auch so schreiben rjmp main reti reti rjmp isr1 rjmp isr2 reti reti reti main: .... isr1: .... isr2: und genauso steht es dann im speicher.
Die Lage der Programme im Speicher erldigt der "Linker". Die einzelnen Programmstücke, z.B. Dein Interrupt hat eine Länge von 100Byte, werden durch den Linker hintereinander im Programmspeicher abgelegt. Wo genau bestimmt der Linker, der weiß nämlich ob eventuell ein bestimmter Bereich des Programmspeichers freizuhalten ist. (Abhängig vom verwendeten µP) Den genauen Speicherort im Programmspeicher findest Du im sogenannten MAP-File Endung meisten ".map". Das ist ein einfaches ASCII-Text-File, das Du z.B: mit dem "Editor" von Windows öffnen kannst, wenn es in der Entwicklungsumgebung nicht geht. In diesem File sucht Du nach der Marke Start oder "Interruptservice" wenn Du die Interupserviceroutine so genannt hast. Dort findest Du die momentan gültige Adresse. Momentan gültig deshalb, weil sich dise Adresse in der Regel bei der kleinsten Programmänderung nach einem erneuten Compilieren/Assemblieren/Linken verändert. Ich hoffe Dir mit dieser Erklärung eteas geholfen zu haben. MfG James
@James seht schön beschrieben, aber bei der Assemblerprogram (vermutlich im AVR-Studio) gibt es keinen Linker, auch wird dabei keine map datei erzeugt.
Ich programmiere PIC16F628 dort gibts .lkr Datei Habe mir auch ne menge darüber reingezogen. Dort steht beispielsweise: CODEPAGE NAME=svector START=0x0 END=0x3 PROTECTED .... .... SECTION NAME=STARTUP ROM=svector dann steht in der main.asm: STARTUP CODE goto main .... ... main movlw .. .... Ich verstehe das nun so dass Hier 000H (org 0) das Programm anfängt. Ist dann der mowlw Befehl in der 005H und weitere dann 006H, 007H usw????? Wenn das stimmt warum ist der erste movlw nicht in 001H.
Hi >@James >seht schön beschrieben, aber bei der Assemblerprogram (vermutlich im >AVR-Studio) gibt es keinen Linker, auch wird dabei keine map datei >erzeugt. Jain. Linker nein, MapFile ja (Option). MfG Spess
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.