Forum: Mikrocontroller und Digitale Elektronik Anfängerfrage zur Programmspeicheraufteilung


von Wanja N. (dasalphatier)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Marcus K. (marcusk)


Lesenswert?

> 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.

von James (Gast)


Lesenswert?

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

von Marcus K. (marcusk)


Lesenswert?

@James
seht schön beschrieben, aber bei der Assemblerprogram (vermutlich im 
AVR-Studio) gibt es keinen Linker, auch wird dabei keine map datei 
erzeugt.

von Wanja N. (dasalphatier)


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.