Ich passe hier gerade den gcc fuer ein Controllerboard mit einem 68k Prozessor an. Der vom Compiler erzeugte Code soll mal im Speicherbereich 0x200000 laufen und der Linker erzeugt dafuer auch seinen Code. Soweit alles gut und richtig. Nach einem Reset befindet sich das Programm aber an der Adresse 0x00000. Das ist notwendig weil die CPU sich dort ihren Resetvektor herholt. Mit anderen Worten der Code laeuft also auf einer Adresse fuer die er nicht uebersetzt wurde. Das ist erstmal kein Problem! Allerdings sollte das so schnell wie moeglich geaendert werden. Dazu kopiere ich etwas Assemblercode aus meinem Flashrom in das Ram des Prozessor und starte das dort. Damit werden dann CS-Leitungen an dem Prozessor umgeschaltet und das Flashrom befindet sich danach an seiner richtigen Stelle. Jetzt muss ich aber noch vom Ram wieder zurueck in das Flashrom springen. Das sieht so aus: asm("jmp _to_rom"); Der Compiler weiss aber leider nicht das der Code in ein Ram kopiert werden soll das ganz woanders liegt. Als Folge erzeugt er mir immer einen PC-relativen Sprung und kein jmp mit einer absoluten Adresse. Ich koennte jetzt mit Attribute section dem Compiler sagen das dieser Code fuer eine bestimmte Section uebersetzt werden soll und dann erzeugt er den richtigen Sprung. Leider liegt der Code dann aber nicht mehr in meinem Flashrom an der richtigen Stelle und meine Kopierfunktion bekommt keine Adresse um die Funktion zu kopieren. Hat einer eine Idee wie man das am elegantesten loesen kann? Meine aktuelle Loesung sieht so aus das ich statt obiger Zeile einfach dies hier schreibe: asm("jmp %c0" : : "g" (0x2201c0) ); Allerdings muss ich mir dann die Adresse aus dem Assembleroutput des Compilers selber besorgen und in mein Programm eintragen. Und natuerlich jedesmal neu wenn sich etwas an der Laenge des PRogramms geaendert hat. Mit anderen Worten inakzeptabler Pfusch. Olaf
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.