www.mikrocontroller.net

Forum: Compiler & IDEs assembler kompilieren


Autor: Andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
Wie ist es möglich, mit avrgcc ein reines .ASM - File zu kompilieren ?


mfg andy

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
avr-gcc -mmcu=<whatever> foo.S -o foo.o

foo.S ist dabei Deine Assemblerquelldatei, die auch noch Dinge wie
#include oder #define enthalten kann, da sie noch durch den C
Präprozessor geschickt wird.

Die gängigen herumfliegenden Makefile-Templates haben dafür auch
Standardregeln.  Wichtig ist, daß auf der Kommandozeile der
Suffix als .S (Großbuchstabe) angegeben wird, bei einem kleinen
,s' würde kein Präprozessor aufgerufen.

Autor: Andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
C:\avrgcc\DDS>avr-gcc -mmcu=at90s2313 myprog.S -o myprog.o
C:\avrgcc\WinAVR\bin\..\lib\gcc-lib\avr\3.3\..\..\..\..\avr\lib\crts2313 
.o(.init
9+0x0): undefined reference to `main'

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Umm, sorry, da fehlt ein -S in meiner Beschreibung.  So versucht er
nicht nur, Dein myprog.S zu assemblieren, sondern will es auch
gleich noch linken.

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Quark, nach 0 Uhr sollte man nichts mehr posten. ;-)

-S macht aus einer C-Quelle ein Assemblerfile.

-c compiliert, was im Falle einer Assemblerquelle dann halt
assemblieren bedeutet.

Autor: Andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dabke für deine schnelle Hilfe !
Aber mit "avr-gcc -mmcu=at90s2313 -S myprog.S -o myprog.o" macht er
zwar was, der ganze assembler-code ist sichtabr bzw läuft am bildschirm
durch, jedoch erzeugt er mir kein *.hex ,... file.
auch kommt keine Fehlermeldung.
Mysteriös.

Autor: Andy (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Um Assembler-Proggramierfehler auszuschliessen, dachte ich mal ein 100%
richtiges Programm zu nehemen, und zwar von Jespers AVR-Page das
miniDDS. Siehe Anhang. Ist jemand das möglich zu kompilieren ? Mir
nicht. In der Datei steht auch was von einer "-x" - Option. Damit
gehts allerdings auch nicht.
Vg.

Autor: Joerg Wunsch (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Naja, das mit dem -S war ja auch falsch, siehe einen Artikel drüber.
Du brauchst ein -c.  Außerdem ist das nur das Compilieren, das
Linken wird davon noch nicht angestoßen, folglich auch keine
endgültige Ausgabedatei, und erst aus der kann man ein iHex-File
erzeugen lassen.

Aber sag mal, es gibt so viele Makefile-Templates, WinAVR hat ja
selbst auch eins dabei, warum nimmst Du nicht das als Ausgangspunkt?
Deine Wißbegierde in allen Ehren, aber erstens kann man das natürlich
auch alles durch das Lesen der man pages rausfinden (das sogenannte
RTFM) -- keine Ausrede, WinAVR installiert diese mit :)...  Irgendwie
haben wir das ja schließlich auch mal gelernt...  Zweitens kommt es
Dir vermutlich ja gar nicht so sehr drauf an, alle Zusammenhänge zu
verstehen, sondern Du willst erstmal ein Ergebnis sehen, vermute ich.

Jespers File bietet gleich mehrere Fallen:

. Es endet auf dem nonstandard-Suffix (aus Unix- bzw. GCC-Sicht)
  .asm.  Dadurch wird das im File beschriebene -x assembler-with-cpp
  nötig.  Benenne es minidds.S (großes ,S', siehe oben), und es
  funktioniert ohne solche Tricks.

. Es benutzt teilweise obsolete Konstruktionen, die im aktuellen
  avr-gcc/avr-libc so nicht mehr funktionieren, da es mal für eine
  viel ältere avr-gcc-Version geschrieben worden ist.  Die Anpassung
  auf die aktuelle Version ist zwar nicht schlimm, aber alles andere
  als eine Übung für einen Anfänger.  Von daher bietet sich sowas
  als Anfängerprojekt überhaupt nicht an, da sollte man IMHO erstmal
  mit einem simplen und gut dokumentierten kleinen Stückchen C
  beginnen, wie es ja auch bei avr-libc (und damit bei WinAVR) aus
  ebendiesem Grunde beiliegt.

. Es ist als standalone-Assembler-Programm geschrieben, d. h. es
  benutzt nicht die normalerweise auch bei Assemblerprogrammen
  automatisch dazugelinkte C-Infrastruktur für Interruptvektoren,
  automatische Initalisierung der Variablen, und dann Aufruf von
  main().  Damit läßt es sich nicht so ohne weiteres in ein normales
  Makefile-Template integrieren, ist also auch aus diesem Grunde
  alles andere als ein Anfängerprojekt.

Ich hänge mal spaßeshalber das daraus generierte ihex-File mit an.

Autor: Andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Herzlichen Dank dafür !

Mit deinen Bemerkungen hast du voll ins Schwarze getroffen.
Ist das eigentlich "normal", dass in deinem hex-file am Anfang so
viele Nullen stehen ?

Vg, Andy

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das kommt vom .org 0x100.  Keine elegante Methode, wenn Du mich
fragst, da auf diese Weise die Verplemperung von ~ 240 Bytes ROM
garantiert ist.  Besser wäre es gewesen, die Tabellen ganz ans
Ende zu setzen und die 256-Byte Grenze mit einem .align abzusichern.

Autor: Andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also dein File funktioniert nacweislich ! respekt!
würdest du mir bitte verraten, wie genau du das kompiliert hast ? hast
du änderungen am code vorgenommen ?

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, die Änderungen am Code stehen unten als context diff.

Ansonsten:

avr-gcc -nostdlib -o minidds.out -mmcu=at90s2313 minidds.S
avr-objcopy -O ihex minidds.out minidds.hex

Allerdings sind die Änderungen am Code der ,,faule Weg''.  Besser
wäre es, entsprechend der Doku zu verfahren und die IO-Port-Zugriffe
auf _SFR_IO8() umzustellen.

--- minidds.S~  Sat Jul 26 09:52:49 2003
+++ minidds.S  Sat Jul 26 09:50:13 2003
@@ -63,7 +63,8 @@

;*********************************************************************** 
*******


-#include <io2313.h>
+#define __SFR_OFFSET 0
+#include <avr/io.h>


   .section   .text

Autor: Andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Perfekt !

Danke dir vielmals !

mfg andy

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Jörg: Man muss allerdings dazusagen dass ein Assemblerprogramm auf
diese Weise ziemlich hässlich wird, wenn jedes IO-Register mit
_SFR_IO8() umklammert ist...

Autor: Peter Fleury (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für das gibts doch Macros:

Auszug auf meiner I2C assembler library:
http://www.mysunrise.ch/users/pfleury/avr-software.html

#define SDA       4        // SDA Port D, Pin 4
#define SDA_OUT    _SFR_IO_ADDR(PORTB) // SDA Port D output

Im Program wird dann nur mittels diesen Macros auf den Port
zugegriffen, damit kann das Programm leicht auf andere Ports/Pins
angepasst werden.

cbi SDA_OUT,SDA

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es sind ja nicht nur die Ports betroffen, sondern auch alle anderen
IO-Register für Timer, AD-Wandler, EEPROM usw.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.