Forum: Compiler & IDEs Relative Adressen in Assembler mit anschließendem Linken?


von joern (Gast)


Lesenswert?

Moin,
ich moechte ein Teil meines Programmes in C und einen in Assembler 
schreiben. Ich kompiliere und linke es mit der GNU-Toolchain. Zum Linken 
benutze ich ein Linker-Script. Leider unterstuetzt meine Architektur nur 
relative branches, jumps and calls, bisher habe ich aber nur rausfinden 
koennen, wie ich absoulte Adressen verwenden. Als  ein
1
 jmpl main
wird assembliert mit der absoluten Adresse (ich brauche aber die 
realtive) und mein Versuch
1
 jmpl . - main
laesst sich nicht assemblieren, da der Assembler zwar die Section des 
aktuellen PCs (den allein kann ich auch richtig laden) findet, die von 
main aber UNKNOWN ist.
Gibt es irgendeinen Befehl, der eine relative Adressierung anweist oder 
einen Trick, wie man die Section kommuniziert?

Danke und Gruss,
Joern

von Uhu U. (uhu)


Lesenswert?

Mir scheint, da ist ein prinzipieller Denkfehler.

Um dem auf den Grund zu gehen, solltest du dich erst mal darüber äußern, 
mit was für einem Prozessor du es zu tun hast.

von joern (Gast)


Angehängte Dateien:

Lesenswert?

Oh, ja, habe ich vergessen, ist der LEON3, eine SPARC ISA 
Implementierung. Also im wesentlichen ein SPARC.
Es mag auch gern ein Denkfehler sein, ich weiß es halt nicht ganz genau.
Mein Problem ist im Moment, dass der Assembler oder Linker meine Labels 
als absolute Adressen behandelt, waehrend ich fuer die meisten Befehle 
relative brauche. Gibt es da irgendeinen Pseudobefehl in Assembler, ne 
Einstellung im Linker, einen Grund, warum es nicht geht und ich die 
Adressen erst mit weiteren Befehlen berechnen muss?
Angehaengt habe ich mal die Assembler-Datei und den Program-Dump.
Gruss, Joern

von joern (Gast)


Angehängte Dateien:

Lesenswert?

Nochmal der Object-Dump.

von Uhu U. (uhu)


Lesenswert?

Und woraus schließt du, daß jmpl main mit absoluter Adresse assembliert 
wird?

Ist simple.s der Quellfile für deinen ASM-Teil?

Wenn ja, warum ist main nicht als externe Referenz deklariert?

von joern (Gast)


Lesenswert?

Ja, es ist die Quelldatei, aber ich hatte 
http://docs.sun.com/app/docs/doc/816-1681/pseudoops-65303?a=view so 
verstanden, als mache es keinen Unterschied und tatsaechlich macht es 
auch keinen. Mit oder ohne global-Deklaration findet der Linker das und 
traegt eine absolute Adresse ein obgleich ich die relative brauche.

Gruss, Joern

von Uhu U. (uhu)


Lesenswert?

> Mit oder ohne global-Deklaration findet der Linker das und
> traegt eine absolute Adresse ein obgleich ich die relative brauche.

Und warum brauchst eine relative Adresse?

von joern (Gast)


Lesenswert?

Auf der Suche nach einem Dokument, das das Verhalten von branches in 
SPARC Assembler beschreibt habe ich gerade folgendes gefunden:
http://www.cs.princeton.edu/courses/archive/spr03/cs217/lectures/Branching.pdf
Ich glaube, ich weiß jetzt, wo mein Denkfehler liegt. Der opcode eines 
Branches kodiert diesen relativ ("target is a PC-relative address.") im 
Assembler gibt man aber natuerlich Labels an und die haben eine absoulte 
Adresse. Ich dachte, object-dump gibt die relative Adresse wieder, waere 
aber ja totaler Quatsch. Ich fuerchte, ich habe mich schon zuviel mit 
den Opcodes herumgeaergert...
Also vielen Dank fuer die Zweifel, ich werde spaeter mal einen 
Programmdurchlauf simulieren und mich nochmal melden, sollte es 
widererwartend doch nicht funktionieren!

Gruss, Joern

von falko (Gast)


Lesenswert?

versuche es mal mit -fpic

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.