Forum: Compiler & IDEs Assembler mit avr-gcc


von blan (Gast)


Lesenswert?

hi, ich wollte mal bischen mit Assembler rumspielen und mich 
einarbeiten. Zwei Artikel hab ich schon durch und bischen was verstanden 
hab ich wohl auch und jetzt wollte ich mein ersten Programm zum laufen 
bekommen aber irgendwas tut nicht. Mein Code sieht so aus ( die Vorlage 
habe ich aus einem Beispiel ):
1
#include <avr/io.h>                ; das gibt den Controllertyp an
2
3
.text                              ; was nun folgt, gehört in den FLASH-Speicher
4
5
.global main                       ; main ist auch in anderen Modulen bekannt
6
7
main:                              ; zu 'main' wird nach Reset hingesprungen
8
        ;....   eigene befehle
9
        
10
        rjmp Hauptschleife
11
        
12
Hauptschleife:                     ; ein Sprunglabel
13
        ;....   eigene befehle
14
        
15
        LDI R24, 0xFF
16
        OUT DDRD, R24
17
        
18
        LDI R24, 0x00
19
        OUT PORTD, R24
20
        
21
        LDI R24, 0xFF
22
        OUT DDRB, R24
23
        
24
        LDI R24, 0xFF
25
        OUT PORTB, R24
26
        
27
        rjmp Hauptschleife         ; immer wiederholen

Assemblieren tu ich mit dieser anweisung:
1
avr-gcc -o beispiel.elf -mmcu=atmega8 test.S && avr-objcopy -O ihex -j .text -j .data beispiel.elf beispiel.hex

kann mir jemand sagen was genau ich falsch mache?

P.S: Warnung bekomme ich folgende geliefert
1
test.S:1:36: warning: extra tokens at end of #include directive

mfg blan

von Benedikt K. (benedikt)


Lesenswert?

Der Kommentar scheint dem Assembler nicht zu gefallen. Mach diesen mal 
hinter dem Include mal weg.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Es sieht so aus, als ob das ; in Spalte 36 kein gültiges Zeichen ist. Es 
soll wohl einen Kommentar einleiten.

Beim GNU AS bist du mit /* */ Kommentaren auf der sicheren Seite
http://tigcc.ticalc.org/doc/gnuasm.html#SEC28

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Ja, um die Warnung zu verstehen, musst du ein wenig von C und dessen
Compiler verstehen. ;-)  Das hängt damit zusammen, dass du für die
Einbindung von <avr/io.h> ein Stück des C-Compilers benutzt, den
sogenannten Präprozessor.  Allerdings versuchst du, dieses Stück
C mit Assemblerkommentaren zu mischen:
1
#include <avr/io.h>                ; das gibt den Controllertyp an

Das versteht der C-Compiler nicht.  Also entweder so:
1
; das gibt den Controllertyp an
2
#include <avr/io.h>

oder so:
1
#include <avr/io.h>                /* das gibt den Controllertyp an */

Aber das ist wohl nicht dein Hauptproblem.  <avr/io.h> ist so
aufgebaut, dass man normalerweise über einen Makro auf die IO-Register
zugreifen soll.  Du musst also schreiben:
1
        LDI R24, 0xFF
2
        OUT _SFR_IO_ADDR(DDRD), R24
3
        
4
        LDI R24, 0x00
5
        OUT _SFR_IO_ADDR(PORTD), R24
6
        
7
        LDI R24, 0xFF
8
        OUT _SFR_IO_ADDR(DDRB), R24
9
        
10
        LDI R24, 0xFF
11
        OUT _SFR_IO_ADDR(PORTB), R24

Siehe auch hier:

http://www.nongnu.org/avr-libc/user-manual/assembler.html

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Stefan B. wrote:

> Beim GNU AS bist du mit /* */ Kommentaren auf der sicheren Seite

Nein, der Assembler darf die auch nicht sehen, der braucht schon das
Semikolon.  Es funktioniert hier aber, da der Präprozessor die
C-Kommentare durch Leerzeichen ersetzt.

von blan (Gast)


Lesenswert?

wunderbar - danke. hat ja sogar bis auf die kleinigekeiten alles 
gestimmt :)

mfg blan

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.