Forum: Compiler & IDEs Assembler in WinAVR


von Matthias (Gast)


Lesenswert?

Hallo FReaks,
ich bin kurz vorm Verzweifeln:
Wie kann ich in WinAVR reinen Assembler compilieren lassen.
Lasse ich im Make-File Target leer, meckert er rum, daß er die ganzen 
".hex" und wie sie alle heißen, nicht erzeugen kann, trage ich eine 
leere Datei ein (Temp für Temp.c, da stand nur ein Kommentar drin) so 
meckert er rum, daß er kein main-Programm findet, trage ich ein leeres 
Main Programm ein
main(){}
meckert er zwar nicht mehr rum, aber ich kann dem .lss-File entnehmen, 
daß er einen leeren Programmrumpf erzeugt hat, und die Interruptvektoren 
alle selber  eingesetzt hat: d.h er hat sich Müll ausgedacht.
Wie mache ich es denn nun richtig?? - AVRStudio ist dann die einzige 
Alternative, wollte aber was für mehrere Plattformen (Win, MAC) haben, 
um nicht dauernd neue Probleme lösen zu müssen.

von Karl H. (kbuchegg)


Lesenswert?

Matthias wrote:
> Hallo FReaks,
> ich bin kurz vorm Verzweifeln:
> Wie kann ich in WinAVR reinen Assembler compilieren lassen.

Meine Meinung:
Einen C Compiler für reines Assembler zu misbrauchen grenzt
an Perversion.

> Wie mache ich es denn nun richtig?? - AVRStudio ist dann die einzige
> Alternative, wollte aber was für mehrere Plattformen (Win, MAC) haben,
> um nicht dauernd neue Probleme lösen zu müssen.

Die hast du sowieso, selbst wenn alle Assembler dieser
Welt die leiche Syntax sprechen würden. Unterschiedliche
Plattformen prorammieren sich nun mal unterschiedlich.

von Matthias (Gast)


Lesenswert?

Ich wollte eigentlich Hilfe und keine Polemik.
Und wenn es so pervers ist, wie mache ich es denn dann???

von Falk B. (falk)


Lesenswert?

@ Matthias (Gast)

>Und wenn es so pervers ist, wie mache ich es denn dann???

Nimm einfach AVR Studio und leg ein Assembler-Projekt an. Fertig.

MFG
Falk

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Vorab: Ich kann mir das auch nur vage zusammenreimen.

Du brauchst ein gutes Verständnis, wei as und ld von make aus aufgerufen 
werden. D.h. wie man Regeln und Kommandozeilen im Makefille erstellt und 
welche Optionen du für as und ld benötigst. Hilfe kann dir die Doku 
geben (bei winAVR in doc/binutils/...)

as soll dir aus *.s ein *.o machen. Und ld soll dir aus *.o ein 
*.elf machen. avr-objcopy erstellt dann aus dem *.elf das brennfertige 
*.hex.

Die Kunst ist jetzt, den ld alles vergessen zu lassen, was mit dem 
Linken von C-Programmen zusammenhängt.

Im Einzelnen heisst das, es soll kein C-Startupcode ("der Teil vor und 
nach deinem Quellcode") und keine Libraries eingebunden werden.

Und das auf C-Programme angepasste Speicherlayout für die einzelnen AVRs 
ist anzupassen, d.h. die Linkercontrolscripte (avr/lib/ldscripts/...) 
sind durch eine eigene Version zu ersetzen

Der Haken an WinAVR ist IMHO, dass die Pfade und Optionen zum Dazulinken 
von Startupcode und Standardlibrary bei der Übersetzung der Toolchain im 
ld selbst oder im Steuerprogramm gcc fest dort eincodiert wurden. Es ist 
vielleicht nicht so einfach das auseinanderzuklamüstern.

Ich würde hier hingehen entweder ein offeneres AVR-GCC Paket holen, bei 
dem alle Quellen dabei sind (z.B. bei Linux) oder ich würde mir mal per 
Option vom gcc ausgeben lassen, welche vollständigen Kommandozeilen an 
as und ld übergeben werden.

Ein Mogelweg ist vielleicht auch noch offen. Du könntest die Toolchain 
wie vorhanden benutzen und dein Dummy-main verwenden aber nur den 
C-Startupcode gegen dein ASM-Programm austauschen.

Damit die Linkercontrolscripte passen (bzw. das eine für dein Target), 
sind einige Symbole und Sektionen in deinem ASM-Code zu definieren.

Welche kann dir der Quellcode des C-Startupcodes sagen. Leider musst du 
um den zu sehen auch auf eine andere Distribution als WinAVR ausweichen; 
denn bei dem ist nur der Objektcode vorhanden.

von Matthias (Gast)


Lesenswert?

Oh, danke (erst mal), vor allem Stefan,
@Falk: AVRStudio ist schon installiert und läuft auch scheinbar ganz 
gut, natürlich nervt die etwas andere Syntax, aber das sind ja 
beherrschbare Probleme.
Ich werde in der Folge wohl doch etwas tiefer einsteigen müssen, evtl 
den gas direkt ansprechen, oder so, mal sehen, was die Zeit dazu sagt. 
Sollte ja mit einem guten Makefile zu machen sein -:).
Auf jeden Fall will ich die Assembler-syntax konform haben, so daß ich 
nicht erst ein Übersetzungstool schreiben muß, welches mir einen 
Assembler-Text in den anderen übersetzt, damit ich am PC (auf Arbeit) 
und am MAC (zu Hause) konform arbeiten kann.
Natürlich ist mir klar, daß selbst 'gleiche' Programme auf Mac und PC 
anders reagieren, (Microsoft hat es ja vorgemacht) am besten halten sich 
da noch die Browser (Firefox und Co), aber über so etwas rege ich mich 
schon gar nicht mehr auf.

von yalu (Gast)


Lesenswert?

Klar ist es möglich, mit der GNU-Toolchain reine Assemblerprogramme zu
schreiben.

Karl heinz schrieb:
> Einen C Compiler für reines Assembler zu misbrauchen grenzt an
> Perversion.

Richtig, wenn man versucht, den Assemblercode in ein .c-File zu
quetschen, d.h. in Form endloser __asm-Statements ;-)

Matthias fragte aber nach WinAVR. Das ist kein C-Compiler, sondern
eine ganze GNU-Toolchain (die als eine Komponente einen C-Compiler
enthält) und noch ein paar Dinge mehr. Damit kann man, außer in C
programmieren, noch viele andere Dinge tun.

> Die hast du sowieso, selbst wenn alle Assembler dieser Welt die
> leiche Syntax sprechen würden. Unterschiedliche Plattformen
> prorammieren sich nun mal unterschiedlich.

Ich glaube, Matthias meint mit "Plattform" die Entwicklungs- und nicht
die Targetplattform. Das Target ist immer ein AVR. Da ist es in der
Tat angenehm, wenn man auf allen Entwicklungsplattformen (Windows und
Mac bei Matthias, bei anderen auch Linux, BSD usw.) die gleichen
Entwicklungstools verwenden und den gleichen AVR-Sourcecode auf
unterschiedlichen Rechnern übersetzen kann. Und AVRStudio gibt es
leider nur für eine einzige (aus meiner Sicht völlig unbedeutende ;-))
Plattform, nämlich Windows.

> Die Kunst ist jetzt, den ld alles vergessen zu lassen, was mit dem
> Linken von C-Programmen zusammenhängt.

Das ist kein großes Problem. Der ld weiß zunächst ziemlich wenig über
das Linken von C-Programmen, da er nicht nur kompilierten C-, sondern
bspw. auch Fortran-, Ada- und eben Assemblermodule linkt. Von C weiß
der ld erst durch die Kommandozeilenoptionen, die ihm vom gcc
übergeben werden. Dazu gehören u.a. die Angaben darüber, welcher
Startup-Code und welche Libraries gelinkt werden sollen.

Wenn du also den as und den ld direkt benutzt, hast du keine Probleme
mit irgendwelchen C-Reliquien. Du musst dich dann allerdings von den
mit mfile automatisch generierten Makefiles trennen und deine eigenen
schreiben.

Alternativ kannst du Assemblerprogramme auch mit gcc assemblieren und
linken indem du ihn mit .S- oder .s-Dateien fütterst. Dann werden as
und ld vom gcc aufgerufen. Der eigentliche C-Compiler (der heißt cc1,
gcc ist eigentlich nur ein Delegator, der andere die Arbeit machen
lässt) bleibt dabei aber außen vor.

Allerdings nimmt der gcc beim Linken an, dass mindestens das
Hauptprogramm ein C-Modul ist und lässt den ld den Startup-Code und
die Standardbibliothek mitlinken. Um das zu vermeiden muss, für den
Linkvorgang gcc mit der Option -nostdlib aufgerufen werden.

Kurz und klein: Du kannst versuchen, die von mfile generierten
Makefiles zu verwenden, in dem du als Quelldateien nur
Assemblerdateien und bei den Linkeroptionen -nostdlib angibst.

Wenn dein Assemblerprogramm nur aus einer Quelldatei besteht, wird der
Code defaultmäßig an die Adresse 0 geschrieben, so dass der nach dem
Reset normal ausgeführt wird. Verwendest du Interrupts, muss der erste
Assemblerbefehl ein Sprung ins Hauptprogramm sein. Auf diesen Sprung
folgen weitere Sprungbefehle für die einzelnen Interrupts.

Besteht das Programm aus mehreren Assemblermodulen, musst du mittels
geeigneter Direktiven im Assemblercode dafür sorgen, dass die
Sprungliste für den Reset und die Interrupts an Adresse 0 zu liegen
kommen. Wie das genau geht, habe ich gerade nicht im Kopf, da ich
selten Assembler programmiere, aber es geht.

Noch etwas: Die meisten Leute programmieren AVR-Assembler mit den
Tools von Atmel. Deren Assemblersyntax unterscheidet sich von der
GNU-Syntax. Du wirst deswegen für den AVR wenig GNU-fähigen
Assemblercode im Netz finden und musst ggf. Atmel-Code nach GNU
umschreiben.

von Matthias (Gast)


Lesenswert?

Danke an Yalu,
so habe ich noch Hoffnung, daß ich eines Tages wirklich auf 
verschiedenen Rechnern quasi das gleiche tun kann. Habe, wie oben 
geschrieben, um des Fortschritts Willen, erst mal das AVRStudio benutzt, 
aber die Option steht immer noch, die GNU-Toolchain dafür zu verwenden.
Ich habe nun zumindest einige Hinweise, wie und die Gewißheit, daß es 
geht.
Matthias

von Ludger Manten (Gast)


Lesenswert?

Schau mal in meinen Beitrag >AES, Rijndael, WinAVR, Library<.
Die aes Library ist in Assembler codiert und ein makefile ist auch 
dabei.

Vielleicht hilft Dir das ja weiter.

Gruss,
Ludger

von Ludger Manten (Gast)


Angehängte Dateien:

Lesenswert?

Wenns wirklich nur Assembler sein soll:-)

Gruss,
Ludger

von Ludger Manten (Gast)


Angehängte Dateien:

Lesenswert?

Hallo *,

bei meinem letzten Eintrag war ich wohl etwas voreilig.

Bei genauerem Nachdenken ist natuerlich klar, dass man nicht das object 
des Assemblers direkt mit OBJDUMP in ein hex-File wandeln darf, da ja 
die Sprungadressen noch nicht aufgeloest sind.

Nun denn, diese Version sollte nun wirklich in der Lage sein 
lauffaehiges Programm aus einem Assembler Source File zu erzeugen.

Viel Spass,
Ludger

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.