Hi, nach dem ich das Pollin-Board bestellt, gelötet und bereits einige Tests damit gemacht habe, ist meine jetztige Spielerei die folgende: ich habe mir eine 3x3-LED-Matrix gelötet. Mein Ziel ist es, dass ich mit einer Frequenz von 1Hz der Rand und dann die LED2,2 blinkt. Nunja, dafür habe ich mir ein Assembler-Programm geschrieben, welches bedingt durch meine sicherlich nicht sehr effiziente Programmierung ca. 200 Zeilen hat. Will ich es nun mit "avra" übersetzen lassen, so wird mir folgender Fehler ausgegeben: "3x3.asm(164) : Error : Branch out of range (-64 <= k <= 63)". Der Befehl in Reihe 166 ist "brne". Ich habe mich bereits ein wenig eingelesen und da sind mir "jmp" und "rjmp" begegnet: der Unterschied ist bekanntlich, dass der erste Befehl absolut springen kann und der zweite relativ (wahrscheinlich relativ von der Position an der dieser sich befindet) springen kann. Es geht also sozusagen um Reichweiten, so wie ich das verstanden habe. Und genau das ist wohl auch das Problem an brne. Meine Frage: gibt es eine Art absolutes brne, womit ich von Zeile 166 zu Zeile 24 (dort ist das Label "main" - die Sprungadresse) springen kann? Ich habe einfach mal die Programmdatei mit drangehängt. Vielleicht kann man das Problem durch intelligentere Programmierung lösen? LG und ich hoffe ihr könnt mir mit der sicherlich relativ einfachen Frage helfen :)
Hallo, die bedingten Sprünge gibts nur relativ, wenn du durch Optimierung die Sprungdistanz nicht verringern kannst musst du den Sprung umbauen. aus:
1 | ;Bedingung |
2 | brne zuweitweg |
3 | ;mach was |
4 | |
5 | zuweitweg: |
6 | ;mach was anderes |
wird:
1 | ;Bedingung |
2 | breq m00 |
3 | rjmp/jmp zuweitweg |
4 | m00: |
5 | ;mach was |
6 | |
7 | zuweitweg: |
8 | ;mach was anderes |
rjmp springt auch schon weiter als die bedingten Sprünge, so das es nicht immer unbedingt jmp sein muss. Sascha
Sprünge können nur einen gewissen Bereich überbrücken, bei den bedingten Sprüngen bei AVR lässen die Instruktionen 7-Bit Signed für den Sprungoffset zu. Diese 7 Bits werden verwendet, um Offsets von -64 bis 63 zu codieren. Weil AVR-Instruktionen immer Word-aligned sind, kann und wird dieser Offset als Word-Offset interpretiert. Wenn du witer Springen willst, dann zB per (hier GNU Assembler) BRNE 0f RJMP .target 0: anstatt BREQ .target Das funktioniert, weil RJMP 13-Bit signed-Offsets zulässt. Falls die auch nicht mehr ausreichen, braucht's JMP.
Hi >Meine Frage: gibt es eine Art absolutes brne, womit ich von Zeile 166 zu >Zeile 24 (dort ist das Label "main" - die Sprungadresse) springen kann? Nein. Aber ersetze einfach
1 | brne main |
durch
1 | breq label |
2 | (r)jmp main |
3 | label ... |
MfG Spess
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.