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

OP #1597373
Lesenswert?

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?
Moderator Persönliche Seite #1598443
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren