Forum: Compiler & IDEs Assembler-Aufrufe in C


von Martin Mohrbach (Gast)


Angehängte Dateien:

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

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


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.html#faq_reg_usage

> 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. ;-)

von Felix J. (feejai)


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.

von Felix J. (feejai)


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?

von Stefan G. (steg13)


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
...
-------

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.