Mein Wissen über AVR-Assembler hab ich aus den Kurzbeschreibungen (xxxx-summary.pdf) und es gibt ein 'atmel instruction set' bei Atmel, aber dort haben die Dokumente blöde Bezeichnungen, die kann ich mir nicht merken. Ausserdem hab ich beim Proggen immer im Auge, was der avr-gcc so anstellt und ob er das macht, das ich meine.
Von Hochspachen kommst du auch an Assembler ran. Zumindest bei Ada, C und C++. Bei letzteren heisst das auch 'Inline Assembler', bei Ada darf nicht gemischt werden. Da muss eine ganze Funktion in Assembler sein.
Ein einfaches Beispiel ist (avr-gcc, GNU C)
__asm volatile ("nop");
nop (no operation) ist von C aus nicht direkt formulierbar, da muß inline asm her. Gleiches für sei oder cli um global IRQs zu aktivieren/deaktivieren.
Eine Duko zu inline asm in winavr findest du in <AVR-GCC>/doc/avr-lib/avr-libc-user-manual-xxx.pdfZitat von <AVR-GCC>/avr/include/avr/interrupt.h
Zwei Werte Addieren würd ich in inline so hinschreiben:
__asm volatile ("add %0, %2" : "=r" (a) : "0" (a), "r" (b));
Dabei sind a, b Werte vom Typ unsigned char, b kann auch ne Konstante sein. Um die richtigen Reloads kümmert sich gcc.
Asm Tutorials findest du nach kräftigem durchgurgeln, zB http://www.avr-asm-tutorial.net/ Ob das gut ist musst du selber entscheiden. Zudem kursieren hier im Forum immer wieder Links von den Assembler-Freaks.
::Edit::
Und noch was: Assembler ist nicht Assembler. Der Assembler von AVR-Studio ist anders als der GNU Assembler Code, den avr-gcc für den avr-as generiert. Die Mnemonics für die Befehle dürften weitgehend gleich sein, aber bei Direktiven, Makrodefinition/Auflösung, Labeldefinition hörts endgültig auf. Und Lokatierungen die man in asm vom Studio sieht, gehen in avr-as auch nicht. Zum Lokatieren ist schliesslich der Linker/Locator avr-ld da!
Lesezeichen