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.
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.