Forum: Compiler & IDEs Asm in AVR GCC?


von qwerty (Gast)


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

von Karl H. (kbuchegg)


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.

von Luther B. (luther-blissett)


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.

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


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

von Ludger (Gast)


Angehängte Dateien:

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 :-)

von qwerty (Gast)


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

von qwerty (Gast)


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

  }

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.