mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Anfänger-Problem mit Assembler


Autor: Alexander (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo !!

Vorab erstmal, ich bin (absoluter) Assembler-Anfänger ;)

Aber ich hab mal ein mehr oder weniger kleines Programm geschrieben, 
dass eigentlich im Simulator auch so funktioniert wie ich das will.

Nur hab ich dann eine Programmzeile hinzugefügt, die mir vollkommen 
unerklärlich eine Fehlermeldung verursacht.

Wär nett, wenn sich den mitgeschickten Code mal jemand ansehen könnte.

genauer:
Wenn der Befehl in Zeile 84 (ldi erg, 0x00) nicht einkommentiert ist, 
regt sich der Compiler auf, dass irgendetwas mit dem dem Befehl (breq 
main) in Zeile 238 nicht passt !

Könnte mir jemand sagen, was daran falsch ist und mit danach vielleicht 
auch sagen, warum das so falsch ist?

Aja, die Tab-Stops, Abstände, ... sehen in AVRStudio viel schöner aus 
als in einem normalen Text-Editor - sorry !

Danke !

mfG
Alexander

Autor: Reiner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich denke mal das die relative sprungweite nicht mehr ausreicht. für 
breq main in zeile 238 ist main zu weit weg.
Um einen rel. sprung kann nur -128 und +127 adressen gesprungen werden.

umbauen oder direkten sprung benutzen

Reiner

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!
Warum der da einen Fehler macht weis ich auch nicht, da ich mich auch 
erst ein paar Wochen mit Assembler beschäftige. Anscheinend gibt es 
irgendeine festgelegte Reichweite für solche Sprünge. Es ist nämlich 
egal was man für eine Zeile dort hinzuschreibt, es kommt immer der 
Fehler. Wenn du das Programm aber so umschreibst sollte es 
funktionieren:
in4_f:
    cbr erg, 0x08    ; Eingabe 4 als ...

    cpi temp, 0x20    ; "Reset" gedrückt?

    brne check      ; nein: check
    rjmp main      ; ja  : zurück

Gruß Matthias

Autor: Alexander (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mhmm .... DANKE !

das scheint es echt zu sein:
weil wenn ich diesen Befehl (ldi erg, 0x00) wieder in den programmcode 
aufnehm und dafür einen anderen befehl auskomentier funktioniert es.

Aber:
Weiter unten im programmcode stehen auch noch einige "rjmp main" und bei 
denen meldet der Compiler nichts. oder wird einfach nicht 
weitercompiliert wenn ein Fehler aufgetreten ist ??

mfG
Alexander

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lieber Alexander,
ein Blick ins instruction manual wird die Wahrheit über "rjmp" 
offenbaren.

Oliver

Autor: Alexander (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo !!!

Tschuldigung, dass ich mich jetzt erst wieder meld - konnte die letzen 
Tage nicht ins Netz!


Also, ich hab mir die Befehle "rjmp", "jmp" und verschiedene "branch 
if..." im Instruction Set mal genauer angeschaut.

Das mit Sprungweiter muß anscheinend echt berücksichtigt werden.


Allerings hab ich doch noch ein paar Fragen dazu:

.) woher weiß ich wärend dem Programmieren, wie weit dieser Sprung genau 
geht? weil nur so kann ich entscheiden ob ich "rjmp" oder "jmp" 
verwenden muß.

.) hat "jmp" irgendwelche Nachteile gegenüber "rjmp" - außer, dass "jmp" 
um 1 Takt länger braucht beim Abarbeiten?


mfG
Alexander

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Alexander,

ich kann jetzt leider nicht effektiv zur Lösung beitragen, da ich mit 
Avr-Gcc in C programmier, aber welche Simulationsumgebung benutzt du?
Ich verwende Visual Micro Lab zum simulieren , und die ist wirklich 
genial... Vielleicht kannst du mit den Meldungen mehr anfangen.
Ich denke das dort dein Sprungproblem rechzeitig erkannt wird.

Die haben auch eine 21Tage Full Featured Testversion
Homepage:
http://www.amtools.net

Viel Spass

Andi

Autor: Eckhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,


jmp hat gegenüber rjmp den nachteil, das absolute adressen verwendet 
werden. Das stört eigentlich wenig. Normalerweise benutzt man sowieso 
immer labels als Sprungziel und der assembler paßt das dann an. Wenn man 
aber nur relativ springt, dann könnte man auch die Binärdatei ohne 
probleme in einem anderen Speicherbereich laufen lassen. Das kann 
nützlich sein wenn man innerhalb einer Controllerfamilie 
unterschiedliche Controller verwendet, die Ihren Speicher an andere 
Adressen haben.

Eckhard

Autor: Alexander (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für euren vielen Antworten !!

Echt super Forum hier !!


mfG
Alexander

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.