rjmp 0 relocatet sein Argument (oder: wie nutze ich .absolute-Section?)

OP #1597373
Ich habe für den mega8 einen Bootloader und will am Ende die Applikation 
ab Adresse 0 starten.  Der Bootloader wird mit
1
BLSTART = 0x1f00
2

3
   avr-ld -Ttext $(BLSTART) ...
gelinkt.  Wenn ich nun testweise an den Anfang des Bootloaders die 
Anweisungen
1
   .section .text
2
   rjmp 0              ; starte bei 0
schreibe, dann funktioniert das nicht.  Im Dissasembler sehe ich auch, 
warum:
1
1f00:       ff cf           rjmp    .-2             ; 0x1f00 <__ctors_end>
Die Adresse in rjmp 0 wird offenbar relativ zur section genommen.

Wie kann ich die Adresse absolut bekommen?

Der Versuch mit
1
   .section .absolute
2
   .org 0
3
bls:  
4

5
   .section .text
6

7
   rjmp bls             ; starte bei 0
ist erfolgreich:
1
1f00:       7f c0           rjmp    .+254           ; 0x2000 <__data_load_end>
es erscheint mir aber wegen des .org-Befehls etwas umständlich.  Kann 
ein Label nicht mit einfacheren Mitteln "absolut" gemacht werden?
OP #1597390
Stefan Ernst schrieb:
> Du könntest ein undefiniertes Symbol nehmen,

das mag im konkreten Fall mit 0 funktionieren, mich interessiert aber 
auch eine grundsätzliche Lösung (z.B. Aufbau einer Sprungtabelle o.ä.).
Moderator Persönliche Seite #1598443
Ulf Rolf schrieb:
> Kann
> ein Label nicht mit einfacheren Mitteln "absolut" gemacht werden?

Nein, natürlich nicht.  Schließlich hast du einen Linker vor dir,
der verschiebliche Segmente zusammenfügen will.  Absolute Adressen
können und dürfen daher erst zur Linkzeit vorgegeben werden, entweder
über Linkerscript oder die Kommandozeile.  .org ist ein Relikt aus
Zeiten der Absolutassembler.  Eigentlich sollte man diese Direktive
streichen. ;-)
OP #1598491
Jörg Wunsch schrieb:

> Nein, natürlich nicht.  Schließlich hast du einen Linker vor dir,
> der verschiebliche Segmente zusammenfügen will.  Absolute Adressen
> können und dürfen daher erst zur Linkzeit vorgegeben werden, entweder
> über Linkerscript oder die Kommandozeile.  .org ist ein Relikt aus
> Zeiten der Absolutassembler.  Eigentlich sollte man diese Direktive
> streichen. ;-)

Hm.  Wie geht das konkret?  Mein Beispiel:

Angenommen, ich habe einen Bootloader und dort ein paar 
Lowlevel-Routinen, die ich zukünftig auch von der Applikation aus 
starten möchte.  Dann muss ich also (a) beim Assemblieren/Linken des 
Bootloaders die Symboltabelle für die Einsprungadressen auswerten und 
(b) beim Assemblieren/Linken der Applikation diese Adressen 
bekanntmachen.  Immer wenn sich die Implementierung der 
Lowlevel-Routinen ändert, verschieben sich alle Adressen, und die 
Applikation läuft nicht mehr, bis sie neu übersetzt wird.

Klassischerweise hat man daher bei solchen "Libraries" eine Tabelle mit 
Einsprungadressen (RJMP-Befehle), deren Ort selbst fest ist.  Wie würde 
ich nun diese festen Einsprungadressen der Applikation so bekanntmachen, 
dass sie der Linker als nicht relozierbar behandelt?  Es würde mich 
wundern, wenn ich nun mit sed die Symboltabelle parsen muss, um daraus 
eine Latte von "--defsym"-Optionen für mein Makefile zu erzeugen?
#1598529
Jörg Wunsch schrieb:
> Ulf Rolf schrieb:
>> Kann
>> ein Label nicht mit einfacheren Mitteln "absolut" gemacht werden?
>
> Nein, natürlich nicht.  Schließlich hast du einen Linker vor dir,
> der verschiebliche Segmente zusammenfügen will.  Absolute Adressen
> können und dürfen daher erst zur Linkzeit vorgegeben werden, entweder
> über Linkerscript oder die Kommandozeile.

Es geht schon auch im Source, denn genau dafür ist die .absolute-Section 
ja da. Die dafür nötigen zwei Zeilen sind ihm ja aber schon zu 
umständlich.
#1598536
Ulf Rolf schrieb:
> Klassischerweise hat man daher bei solchen "Libraries" eine Tabelle mit
> Einsprungadressen (RJMP-Befehle), deren Ort selbst fest ist.  Wie würde
> ich nun diese festen Einsprungadressen der Applikation so bekanntmachen,
> dass sie der Linker als nicht relozierbar behandelt?  Es würde mich
> wundern, wenn ich nun mit sed die Symboltabelle parsen muss, um daraus
> eine Latte von "--defsym"-Optionen für mein Makefile zu erzeugen?

Bei einer Tabelle geht es doch bloß um eine Ádresse, nämlich die der 
Tabelle selbst. Diese eine Adresse machst du der Applikation einfach per 
--defsym bekannt.
OP #1598732
Stefan Ernst schrieb:

> Es geht schon auch im Source, denn genau dafür ist die .absolute-Section
> ja da. Die dafür nötigen zwei Zeilen sind ihm ja aber schon zu
> umständlich.

Nicht zu umständlich - sondern ich war mir nicht sicher, ob mein obiger 
Ansatz der empfohlene ist.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.