Forum: Compiler & IDEs AVR-GCC Inline Assembler Problem


von Chris (Gast)


Lesenswert?

Hallo Leute,

Ich hoffe es kann mir jemand bei meinem Problem helfen.

Ich möchte in meinem C-Source eine Assembler-Zeile mit einem CALL auf 
eine bestimmte Adresse.

zB       asm volatile("call 0x0A16":);

Das Problem ist, dass mir der Compiler nicht diesen Sprungbefehl korrekt 
einbinden tut. Anstatt auf 0x0A16 zu springen, will er auf 0x050B.

Was mache ich falsch?


Danke gleich mal vorweg.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Du willst nicht wirklich zu einer hartcodierten Addresse springen.

Definiere ein Symbol, springe dorthin und lass den Rest den Linker 
übernehmen.

Sprünge zu int-Adressen werden nicht unterstützt, siehe

http://gcc.gnu.org/onlinedocs/gcc/AVR-Options.html#index-g_t_0040code_007bEIND_007d-1109

von Krapao (Gast)


Lesenswert?

0x0A16 ist eine Byte-Adresse und 0x050B ist die dazugehörige 
Word-Adresse (gerade die Hälfte). Es ist korrekt, die Byteadresse beim 
CALL anzugeben.

Bei der Anzeige im Debugger kann es sein, dass die Word-Adresse 
angezeigt wird, weil der Flash wortweise organisiert ist.

Also zuerst z.B. durch Disassemblieren prüfen, welcher Code bei 
Word:0x050B liegt. Das ist möglicherweise der gleiche Code wie an 
Byte:0x0A16. Ein gutes Gefühl für die Anzeige bekommt man, wenn man sich 
die Interruptvektortabelle ab 0x0000 mal ansieht. Dann wird klar, ob die 
Adressen in +1 Schritten hochzählen oder in +2 Schritten. Man kann sich 
auch die <projekt>.LSS Datei des AVR-GCC mit dem ASM-C-Mix ansehen.

Wenn nicht, dann ist zu prüfen, wie du den Code an die Byte:0x0A16 
Adresse geschafft hast und ob er wirklich dort gelandet ist. Wenn du 
beim Code-Hochladen an Word:0x0A16 geschrieben hast, liegt dein Code bei 
Byte:0x142C

von Oliver (Gast)


Lesenswert?

Krapao schrieb:
> 0x0A16 ist eine Byte-Adresse und 0x050B ist die dazugehörige
> Word-Adresse (gerade die Hälfte). Es ist korrekt, die Byteadresse beim
> CALL anzugeben.

Wer dadurch verwirrt ist, sollte eigentlich grundsätzlich überhaupt 
nicht per inline-Assmebler im C-Code herumspringen. Da sollte man schon 
wissen, was man da tut.

Oliver

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.