mikrocontroller.net

Forum: Compiler & IDEs Asm in AVR GCC?


Autor: qwerty (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute! Ich bin ein Einfänger.
Also, Könnte mir irgend jemand sagen, ob es in AVR-GCC eine Möglichkeit 
Asm Code nutzen gibt?

Mein Bs
//--------------ASM to GCC -----------------
#include <avr/io.h>
#include <avr/interrupt.h>
int main (void){
asm volatile (


"ldi r16,low(RAMEND)" //;Set Z low byte

"out spl,r16"
"ldi r16,high(RAMEND)" //;Set Z high byte

"out sph,r16"
"ldi r16,(1<<6) | (1<<7)"
"out DDRD,r16" //; Write zeros to Port B
"loop:"
"ldi r16,(1<<6)"// ;PD6 blinkt
"out PORTD,r16"
"rcall delay"
"ldi r16,(1<<7)"// ;PD7 blinkt
"out PORTD,r16"
"rcall delay"
"rjmp loop"
"delay:"
"ldi r16,30"
"delay1:"
"ldi r17,200"
"delay2:"
"ldi r18,200"
"delay3:"
"dec r18"
"brne delay3"
"ret"
"dec r17"
"brne delay2"
"dec r16"
"brne delay1"
"ret"
);
}

// gcc plug-in: Error: Object file not found on expected location 
C:\Tests\gcc\default\qwerty.elf

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
qwerty wrote:
> Hallo Leute! Ich bin ein Einfänger.
> Also, Könnte mir irgend jemand sagen, ob es in AVR-GCC eine Möglichkeit
> Asm Code nutzen gibt?

Prinzipiell ja.
Allerdings erhebt sich die Frage: Wozu
Wenn du Anfänger bist, dann schreib deine Programm in C.
Assembler braucht man nur dann, wenn es wirklich auf den
letzten Taktzyklus ankommt und man eine Optimierung machen
muss, die der Compiler so nicht hinkriegt, weil ihn die
C Regeln einschränken.

>
> Mein Bs

Wenn du einen C Compiler benutzt, dann schreibe auch in C.
Wenn du in Assembler programmieren willst, dann benutze
auch einen Assembler (wie zb den im AVR-Studio).
Alles andere ist der Versuch, sich selbst ins Knie zu schiessen.

Autor: Luther Blissett (luther-blissett)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger wrote:

> Wenn du einen C Compiler benutzt, dann schreibe auch in C.
> Wenn du in Assembler programmieren willst, dann benutze
> auch einen Assembler (wie zb den im AVR-Studio).
> Alles andere ist der Versuch, sich selbst ins Knie zu schiessen.

Tatsächlich schiessen sich Anfänger mit dem gcc inline assembler 
eigentlich nur ins Knie.

@qwerty: Der gcc inline assembler unterscheidet sich grundlegend von den 
inline assemblern die du vielleicht von Borland-C oder Visual Studio 
kennst, denn er ist so entworfen, daß er mit dem *Optimierer 
zusammenarbeitet*, d.h. du kannst sicheren assembler code mit hoch 
optimierten code mischen (andere compiler schalten in Gegenwart von IA 
den Optimierer einfach ab). Damit das funktioniert, ist es *absolut 
notwendig* die sog. operand constraints zu verstehen.

Zu Anfang kannst du dir diesen Text zu Gemüte führen:
http://www.nongnu.org/avr-libc/user-manual/inline_asm.html

und dann den entsprechenden Eintrag im gcc Manual lesen:
http://gcc.gnu.org/onlinedocs/gcc-4.2.3/gcc/Constraints.html

Wenn du dir danach etwa die Frage beantworten kannst, was einen "early 
clobber" von einem "clobber" unterscheidet und warum man ihn 
spezifizieren muss, bist du nach meiner Erfahrung sicher genug.

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

Bewertung
0 lesenswert
nicht lesenswert
Mit anderen Worten: der Inline-Assembler ist ein mächtiges Werkzeug
für Entwickler von Bibliotheken, während Endnutzer in der Regel ohne
ihn auskommen können sollten.

Da der GCC mit einem Linker arbeitet, der verschiebliche
("relocatable") Objektmodule auch aus verschiedenen Sprachen
miteinander kombinieren kann, kann man für wirklich zeitkritische
Dinge immer noch reine Assemblerdateien dem C-Code mit zur Seite
stellen.  Das ergibt in den meisten Fällen ohnehin besser lesbaren
Code als die Benutzung des Inline-Assemblers.  Siehe auch:

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

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

Bewertung
0 lesenswert
nicht lesenswert
Hi,

anbei noch ein kleines Beispiel, indem der PORTB eines ATMega1281 
gesetzt wird.
Hierbei ist das Setzen des Ports in einer Assembler Datei codiert, deren 
Object dann zum C-Object dazugelinkt wird.

Vielleicht hilft es ja :-)

Autor: qwerty (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Hi,

>anbei noch ein kleines Beispiel, indem der PORTB eines ATMega1281
>gesetzt wird.
>Hierbei ist das Setzen des Ports in einer Assembler Datei codiert, deren
>Object dann zum C-Object dazugelinkt wird.

>Vielleicht hilft es ja :-)>

thanksssssssssssss   :D :D :D

Autor: qwerty (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schafffffffffffffffffffft :)
#include <avr/io.h>
#include <stdio.h>

unsigned char a,b=0,foo;
int main(void){

    #define swap(a)
    ({unsigned char _a_ = (unsigned char) a;
    asm volatile ("swap %0" : "=r" (_a_) : "0" (_a_));
    _a_;
    });

b=swap(a+5)

printf("b\n");

  }

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.