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


von Alexander (Gast)


Angehängte Dateien:

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

von Reiner (Gast)


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

von Matthias (Gast)


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

von Alexander (Gast)


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

von Oliver (Gast)


Lesenswert?

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

Oliver

von Alexander (Gast)


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

von Andi (Gast)


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

von Eckhard (Gast)


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

von Alexander (Gast)


Lesenswert?

Vielen Dank für euren vielen Antworten !!

Echt super Forum hier !!


mfG
Alexander

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.