mikrocontroller.net

Forum: Compiler & IDEs Assembler-Aufrufe in C


Autor: Martin Mohrbach (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute!

Ich mache erste Gehversuche in C, arbeite das Tutorial durch und dachte
zuerst, ich hätte Pkt. 18.2 "Assembler-Dateien" verstanden. Zur
Prüfung meines "neuen Wissens" habe ich mir eine fertige
Assembler-Datei aus den Code-Beispielen geladen (DCF77
AVR-Assemblerbaustein, Autor: Pit, Datum: 09.01.2006 19:57, Dateianhang
dcf77dec.asm). Hierzu ergeben sich 2 Fragen.

1. Frage: Das Tutorial Beispiel zur Funktion superFunc ...

   // setze alle Pins von PortD auf Ausgang
   .global superFunc
   .func superFunc
   superFunc:
      push workreg
    1ec:  0f 93         push  r16
      ldi workreg, ALLOUT
    1ee:  0f ef         ldi  r16, 0xFF  ; 255
      out  _SFR_IO_ADDR(DDRD), workreg
    1f0:  01 bb         out  0x11, r16  ; 17
      pop workreg
    1f2:  0f 91         pop  r16
      ret
    1f4:  08 95         ret


... beginnt mit "push workreg" und endet mit "pop workreg". Das
fand ich auch logisch, da die Registerwerte nach Funktionsende erhalten
werden sollen.
Im Programm dcf77dec.asm werden 6 Register benutzt. Trotzdem wird
nichts gepusht und gepopt. Geht der Autor davon aus, daß das jeder
Benutzer "barfuß" hinzufügt, macht das der Compiler automatich oder
ist das "retten" der Registerinhalte nicht erforderlich?

2. Frage: Unabgängig von (1.) habe ich versucht dcf77dec.asm in ein
C-Programm einzubinden. Also:
    dcf77dec.asm umbenannt in DCF77.S
    ins Makefile ASRC = DCF77.S
    folgendes Miniprogramm Test.c geschrieben

#include <avr/io.h>
extern void dcf77_init(uint8_t DCF77CT[]);    //Deklarieren der
init-Funktion innerhalb von dcf77.S
extern void dcf77_start(uint8_t DCF77CT[]);   //Deklarieren der
start-Funktion innerhalb von dcf77.S

int main(void)
{
static uint8_t DCF77CT[20];     //20 Byte im RAM anlegen, weil das
DCF77.S 20 Byte benötigt

  dcf77_init(DCF77CT);          //Aufruf der Assemblerfunktion mit
Übergabe der Adresse
  dcf77_start(DCF77CT);
}

Leider wirft der Compiler massenweise Fehlermeldungen aus die sich alle
auf DCF77 beziehen.

Compiling: Test.c
avr-gcc -c -mmcu=atmega16 -I. -gdwarf-2 -DF_CPU=8000000UL  -Os
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall
-Wstrict-prototypes -Wa,-adhlns=Test.lst  -std=gnu99 -MD -MP -MF
.dep/Test.o.d Test.c -o Test.o

Assembling: DCF77.S
avr-gcc -c -mmcu=atmega16 -I. -x assembler-with-cpp
-Wa,-adhlns=DCF77.lst,-gstabs,--listing-cont-lines=100 DCF77.S -o
DCF77.o
DCF77.S: Assembler messages:
DCF77.S:26: Error: constant value required
DCF77.S:30: Error: junk at end of line, first unrecognized character is
`8'
DCF77.S:40: Error: constant value required
DCF77.S:41: Error: constant value required
DCF77.S:53: Error: junk at end of line, first unrecognized character is
`1'
DCF77.S:66: Error: junk at end of line, first unrecognized character is
`1'
DCF77.S:68: Error: junk at end of line, first unrecognized character is
`2'
DCF77.S:76: Error: junk at end of line, first unrecognized character is
`1'
DCF77.S:79: Error: junk at end of line, first unrecognized character is
`2'
DCF77.S:82: Error: junk at end of line, first unrecognized character is
`2'
DCF77.S:85: Error: junk at end of line, first unrecognized character is
`2'
DCF77.S:88: Error: junk at end of line, first unrecognized character is
`3'
DCF77.S:91: Error: constant value required
DCF77.S:91: Error: register r24, r26, r28 or r30 required
DCF77.S:91: Error: `,' required
DCF77.S:91: Error: garbage at end of line
DCF77.S:93: Error: constant value required
DCF77.S:94: Error: constant value required
DCF77.S:105: Error: junk at end of line, first unrecognized character
is `3'
DCF77.S:107: Error: junk at end of line, first unrecognized character
is `8'
DCF77.S:119: Error: constant value required
DCF77.S:119: Error: register number above 15 required
DCF77.S:119: Error: garbage at end of line
DCF77.S:120: Error: constant value required
DCF77.S:120: Error: register number above 15 required
DCF77.S:120: Error: garbage at end of line
DCF77.S:121: Error: garbage at end of line
DCF77.S:122: Error: garbage at end of line
DCF77.S:123: Error: junk at end of line, first unrecognized character
is `0'
make.exe: *** [DCF77.o] Error 1

> Process Exit Code: 2
> Time Taken: 00:00

Ich glaube aber nicht, daß Pit ein fehlerhaftes Programm ins Netz
gestellt hat (zur Erinnerung nochmals anbei). Offensichtlich habe ich
irgendwas noch nicht gerafft.

Kann mir jemand sagen, was ich falsch gemacht habe?

Vielen Dank schon jetzt und Bitte um Entschuldigung für mein
Halbwissen!

Martin

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Im Programm dcf77dec.asm werden 6 Register benutzt. Trotzdem wird
> nichts gepusht und gepopt. Geht der Autor davon aus, daß das jeder
> Benutzer "barfuß" hinzufügt, macht das der Compiler automatich
oder
> ist das "retten" der Registerinhalte nicht erforderlich?

http://www.nongnu.org/avr-libc/user-manual/FAQ.htm...

> avr-gcc -c -mmcu=atmega16 -I. -x assembler-with-cpp
-Wa,-adhlns=DCF77.lst,-gstabs,--listing-cont-lines=100 DCF77.S -o
> DCF77.o
> DCF77.S: Assembler messages:

Das Programm scheint für einen anderen Assembler als den gas
geschrieben zu sein.  Erstens erfährt dieser auf magische Weise über
Dinge wie PINB, zweitens benutzt er eine komplett andere Syntax.

Du musst das wohl oder übel umschreiben.

> DCF77.S:26: Error: constant value required

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

Schreib #include <avr/io.h> drüber, und packe das PINB in ein
_SFR_IO_ADDR(PINB) ein.

> DCF77.S:30: Error: junk at end of line, first unrecognized character
is
> `8'

Hexadezimale Konstanten im gas heißen 0x80, nicht $80.

> DCF77.S:40: Error: constant value required
> DCF77.S:41: Error: constant value required

ZH und ZL gibt's ebenfalls über <avr/io.h>.

> DCF77.S:91: Error: constant value required
> DCF77.S:91: Error: register r24, r26, r28 or r30 required
> DCF77.S:91: Error: `,' required
> DCF77.S:91: Error: garbage at end of line

ADIW benutzt im gas nur den Namen des ersten Registers (r30 bzw. ZL),
nicht r30:r31.

> DCF77.S:119: Error: constant value required
> DCF77.S:119: Error: register number above 15 required
> DCF77.S:119: Error: garbage at end of line
> DCF77.S:120: Error: constant value required
> DCF77.S:120: Error: register number above 15 required
> DCF77.S:120: Error: garbage at end of line
> DCF77.S:121: Error: garbage at end of line
> DCF77.S:122: Error: garbage at end of line

LOW und HI heißen lo8 und hi8.

Ich denke, dass ich jede Klasse von Fehler einmal in der Auflistung
habe, umschreiben musst du es schon selbst. ;-)

Autor: Felix Jankowski (feejai)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, den alten Thread auszugraben. Würde gerne das IGOR UDP projekt
einbinden. Was muss man alles vom AVR-Studio ASM V.1 zu dem gcc-ass.
verändern? habe versucht das tutorial und diesen thread zu verstehen,
sieht aber schlecht aus.

Autor: Felix Jankowski (feejai)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gibts vielleicht irgendwo eine Anleitung oder Ähnliches, die beschreibt
was man alles für den Assembler verändern muss, um aus einer .asm-Datei
eine .S-Datei zu machen? Habe schon dieses Forum durchsucht und auch
gegoogelt, habe aber leider nix gefunden. Könnt jemand der so was schon
gemacht hat mir dabei helfen?

Autor: Stefan Gemmel (steg13)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Um wie im Tutorial ein .s File einzubinden muss man es nur unter Source 
Files einbinden. Rechte Maustaste "Compile File"
Das Makefile wird automatisch erzeugt

Beispiel:
File: "setzeEinAus.s"
------
// ** Setze alle Pins von PortB auf Ausgang **
// keine Parameter, keine Rueckgabe
.global bit1Aus
.func bit1Aus

 bit1Aus:
   sbi 0x17,1
   ret
.endfunc

.end
------

im c-Programm:
------
int main()
{

bit1Aus();  // Pin1 DDRB als Ausgang schalten
...
-------

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.