PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Fehler in Assembler?



Exodus
23.06.2006, 11:17
Warum kommt bei mir bei diesem befehl:
cpi R16, 0x0A
breq T10

Fehlermeldung:
"Relative branch out of Reach"

MFG
Michi

PicNick
23.06.2006, 11:22
Er sagt's ja eh. Das Sprungziel darf nur +/- 63 Worte weit weg sein.

Tip: Wenn du Assembler programmierst, druck' dir das AVR Instruction-Set aus, binde es in Schweinsleder mit Goldlettern und mach es zu deiner Bibel. Und immer dreimal nachschauen, bevor du einen Befehl wo hinschreibst. Du kommst sonst nicht weiter.

Exodus
23.06.2006, 11:27
danke *gg* :-) ok werd ich machen!! so und wie kann ich dass jetzt am besten anstellen?
anderen integer wert?
ahja ich programmiere in assembler und nicht in C!

MFG
Michael

SprinterSB
23.06.2006, 11:30
Du drehst die Bedingung um und machst einen kurzen (relativen) Spring über einen langen (absoluten) Sprung. Letzterer kann überall landen.

PicNick
23.06.2006, 11:30
neinein, der CPI ist schon ok. es geht um den "breq"
Einmal um die Ecke:


CPI r16, 0x0A
BRNE UnGleich
jmp T10
UnGleich:
....

Exodus
23.06.2006, 11:31
hab es schon hab es einfach ins -63 gesetzt!

MFG
Michael

SprinterSB
23.06.2006, 11:51
@PicNick: Kann man den breq nicht stehen lassen und im Assembler branch relaxing aktivieren? branch relaxing ist ja eine Aufgabe eines Assemblers (neben Assemblieren, Symbolverwaltung, etc).

PicNick
23.06.2006, 12:06
Glaub ich nicht. Wenn ich im Assembler "BREQ", also eindeutig eine AVR-Instruction hinschreibe, und er fängt dann an, schöpferisch zu werden, wurde ich ihm sofort das Genick brechen.

Wenn einer meint, kann er ja einen Macro schreiben, der je nach distanz verschiedenen Code generiert.

Für sowas ist ja u.A "C" gemacht, dann geht mich das nix mehr an. (mal abgesehen davon, daß eine "goto" ein Pfui-Gack ist)

SprinterSB
23.06.2006, 12:12
Glaub ich nicht. Wenn ich im Assembler "BREQ", also eindeutig eine AVR-Instruction hinschreibe, und er fängt dann an, schöpferisch zu werden, wurde ich ihm sofort das Genick brechen.

Wenn einer meint, kann er ja einen Macro schreiben, der je nach distanz verschiedenen Code generiert.

Für sowas ist ja u.A "C" gemacht, dann geht mich das nix mehr an. (mal abgesehen davon, daß eine "goto" ein Pfui-Gack ist)
Nö, das ist eher üblich, daß Assembler sowas tun und (etwas) anderen MaschinenCode erzeugen, als sie bekommen. Ein Hauptgrund dafür kann sein, dein der Compiler nicht weiss oder garnicht wissen kann wie weit zu springen ist. Das tritt typischerweise dann auf, wenn sich Instruktionslängen erst zur Linkzeit ergeben -- in dem Falls würde sogar erst der Linker relaxen. Weiteres Beispiel kann der Workaround von Silicon-Bugs, die teilweise nur von Assembler oder (dynamschem) Linker gefixt werden können. So, genug OT :-)