AVR: Absolute Jumps mit rjmp

03/02/2008 - 03:08 von Johannes Bauer | Report spam
Hallo Gruppe,

und gerade ist mir beim Herumspielen noch etwas aufgefallen: Wenn ich
aus einer C-Datei, die ich mit avr-gcc übersetze auf einem AVR einen
absoluten Jump einfügen will, ohne das jmp-Kommando zu verwenden (das
unterstützen einige Einheiten ja nicht), muss ich auf rjmp ausweichen.
Damit das automatisch die aktuelle Adresse verwendet:

__asm__ __volatile__("JumpLbl: rjmp .+0x100 - JumpLbl");

führt im Code dazu:

274: 73 cf rjmp .-282 ; 0x15c

d.h. immer 0x5c Bytes zu weit. Wenn ich diese 0x5c immer abziehe

__asm__ __volatile__("JumpLbl: rjmp .+0x100 - JumpLbl - 0x5c");

dann klappt es - aber eine "saubere" Lösung ist das nicht. Insbesondere
denke ich mal, dass diese 0x5c davon abhàngen für welches Device ich
übersetze (Anzahl der Interruptvektoren u.à.). Ich nehme an, dass diese
Differenz damit zusammenhàngt, dass das "JumpLbl" Label aufgelöst wird,
bevor der Code reloziert ist (also vor dem Linkerskript). Wie bekomme
ich das Deviceunanhàngig hin?

Viele Grüße,
Johannes

"PS: Ein Realname wàre nett. Ich selbst nutze nur keinen, weil mich die
meisten hier bereits mit Namen kennen." -- Markus Gronotte aka Makus /
Kosst Amojan / maqqusz / Mr. G / Ferdinand Simpson / Quartillia
Rosenberg in dse <45608268$0$5719$9b4e6d93@newsspool3.arcor-online.net>
 

Lesen sie die antworten

#1 j
03/02/2008 - 08:29 | Warnen spam
Johannes Bauer schrieb:

und gerade ist mir beim Herumspielen noch etwas aufgefallen: Wenn
ich aus einer C-Datei, die ich mit avr-gcc àŒbersetze auf einem AVR
einen absoluten Jump einfàŒgen will, ...



Was soll das denn für einen Sinn haben?

Wenn du Assembler schreiben willst, dann schreib Assembler, aber
irgendwie wild aus einer C-Datei rumspringen hat keinen Sinn.

cheers, J"org .-.-. --... ...-- -.. . DL8DTL

http://www.sax.de/~joerg/ NIC: JW11-RIPE
Never trust an operating system you don't have sources for. ;-)

Ähnliche fragen