mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Anfängerfrage zur Programmspeicheraufteilung


Autor: Wanja Ne (dasalphatier)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Marcus Kunze (marcusk)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: James (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Marcus Kunze (marcusk)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Wanja Ne (dasalphatier)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.