Anfänger-Problem mit Assembler

Gast #26518
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
Angehängte Dateien:
Gast #26520
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
Gast #26521
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
Gast #26523
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
Gast #26524
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
Gast #26525
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren