www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVRASM: Sprünge mit PC +/- X


Autor: Philipp Burch (philipp_burch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

im Allgemeinen ist es im AVR Assembler ja üblich, ein Label zu
definieren und per rjmp, breq, ... dorthin zu springen. Allerdings gibt
es ja auch die Möglichkeit über den Programmcounter (PC) um einfach
einige Anweisungen nach "vorne"/"hinten" zu springen.
Beispiel:
  lds temp2, RAMSTART + A_MENULEVEL
  tst temp2
  brne PC + 6
    lds temp1, RAMSTART + A_MENUENTRY0
    lds temp2, RAMSTART + A_MENUMAXE0
  rjmp PC + 4
    lds temp1, RAMSTART + A_MENUENTRY1
    lds temp2, RAMSTART + A_MENUMAXE1

Das funktioniert so, aber mir ist nicht ganz klar, wie man den
korrekten Betrag für den Programmcounter ausrechnet. Um eine einzelne
Zeile zu überspringen scheint ja 2 der richtige Betrag zu sein. Beim
oben genannten brne ist es 6 für drei Zeilen, daher eigentlich immer zu
überspringende Zeilenzahl * 2. Aber stimmt das wirklich so?
An einem anderen Ort im Programm hab' ich z.B. diese Konstruktion:
  sbic PIND, 3
  rjmp PC + 4
    sbrs Buttons, BTN_ENTER
      sbr Buttons, 1 << BTN_ENTER_F
    rjmp PC + 2
    cbr Buttons, 1 << BTN_ENTER
Auch das funzt, obwohl hier beim ersten rjmp mit dem Betrag 4 gleich
drei Anweisungen übersprungen werden :-/
Spielt die Art der Anweisungen eine Rolle?

Ich wäre froh, wenn mir das mal jemand erklären könnte, im Datenblatt
finde ich grade nix dazu...

Danke im Voraus!

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wär' ich vorsichtig mit sowas. Atmels Assembler rechnet in Worten, GNUs
Assembler in Bytes. Kann man leicht verwirrt werden.

Autor: Michael Nagler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der AVR Assembler übersetzt den Quelltext in 16 Bit breite
Maschinenbefehle (Opcode). In der Assemblerhilfe ist der Opcode zu
jedem Assemblerbefehl dargestellt. Man muss also wissen, wieviele Words
Maschinencode übersprungen werden müssen, um das korrekte Sprungziel
errechnen zu können.
Beim Disassemblieren werden die Opcodes ausgewertet und in lesbaren
Text umgesetzt. Da der Name der Sprungmarke beim assemblieren verloren
geht, kann der Disassembler nur relative Sprungmarken zurückgewinnen
(PC +/- x Words), wenn keine extra Debug-Info gespeichert wird.
Selbst einen solchen Quelltext ohne Sprungmarken zu schreiben würde ich
allerdings dringend vermeiden, weil m. E. die Fehlersuche enorm
erschwert wird.

Gruß
Michael

Autor: Jadeclaw Dinosaur (jadeclaw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, die Art der Anweisungen ist hier entscheidend.
Schau mal hier rein:
http://www.atmel.com/dyn/resources/prod_documents/...
Dieses File enthält den kompletten Befehlssatz,
inklusive Angaben darüber, wieviele Words und Takte ein Befehl
verbraucht.

Übrigens, diese Art der Sprungzielberechnung ist nicht zu empfehlen,
man ändert irgendwo etwas, vergisst u. U. dann den Offset anzupassen,
mit dem Ergebnis, dass man sich 'nen Wolf sucht.
Mit festen Labels kann der Assembler das auch selber tun.

Gruss
Jadeclaw.

Autor: Philipp Burch (philipp_burch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, das wollte ich wissen, danke euch.
Ich verwende meistens ja auch Labels als Sprungziele, aber wenn es nur
so ein, zwei, höchstens vier Zeilen sind, finde ich diese Möglichkeit
noch praktisch. Jedenfalls sucht man so auch nicht länger nach einem
Fehler, als wenn man zwei ähnlich geschriebene Labels hat und irgendwo
aus Versehen zum falschen springt... Aber für was hat man ja den
Debugger ;)

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.