Topics / Index / English

Assembler Programmierung mit WinAVR

Content (automatic)

Inline Assembler

Inline assembler werden in einem pseudo-Aufruf asm(code : Ausgabe-Operanten-Liste : Eingabe-Operanten-Liste : Liste-yerstörter-Register); codiert. Alle Elemente sind Text-Strings, die besonderen Regeln folgen müssen
Im Code wird für die Operanten %0, %1 ... geschrieben
Die Operantenliste legt fest, wo die Operanten erwartet  werden:
"=r"  Ein Wert
"I" eine
Beispiel:
asm volatile("in %0, $1" : "=r" (value) : "I" (_SRF_IO_ADDR(PORTD)));
Beispiel:
asm volatile("cli" : : );

Folgende besonderen Register können benutzt werden:
Symbol
Register
__SREG__
Status register 0x3F
__SP_H__
__SP_L__
Stack Pointer High Byte 0x3E
Stack Pointer High Byte 0x3D
__tmp_reg__
Register r0, Für kurzzeitige Ablage
__zero_reg__
Register r1, enthält immer 0

Kennbuchstabe
Benutzung
Bereich
a
Einfache Register der oberen Hälfte
r16 ... r23
b
Feldadressen
y(=r29:r28) z(=r31:r30)
d
Alle Register der oberen Hälfte
r16 .. r31
e
Alle 3 Zeigerregister
x,y,z
G
Gleitkommakonstante
0.0 .. ?.???E+???
I
6-bit-Integer
0 .. 63
J
6-bit-Integer, negativ
-63..0
K
Integerkonstante
-32767..32768 oder 32 bit ?
L
Integerkonstante -32767..32768 oder 32 bit ?
l
Untere Register
r0 ... r15
M
8-Bit Ganzzahl
0...255



















Vor einem Aufruf von C-Unterprogrammen müssen die Register gerettet werden, wenn deren Inhalte nach dem Aufruf noch benötigt werden: r18-r27, r30-r31

Unterprogramme müssen die folgenden Register wiederherstellen bevor sie zurückkehren: r2-r17,r28-r29

Nicht gerettet werden braucht r0 und r1, aber r1 muss nach jeder Benutzung wieder auf 0 gesetzt werden (clr r1).


Der Compiler weist Register zu, die durch %A0 ... %D3 im Assembler angesprochen werden können.
A0,B0,C0,D0 : Alle vier Bytes des ersten Operanten
A1,B1,C1,D1 : Alle vier Bytes des zweiten Operanten


Wird der gesamte Speicher durch die Assemblerroutine umgearbeitet, dann wird dies durch [volatile] und durch [: "memory"] gekennzeichnet.
{
uchar s;
asm volatile(
"    in %0, __SREG__               \n"
"    cli                           \n"
"    ld __tmp_reg__, %a1           \n"
"    inc __tmp_reg__               \n"
"    st %a1, __tmp_reg__           \n"
"    out __SREG__, %0              \n"
     : "=&r" (s)
     : "e" (ptr)
     : "memory"
);
}


Dokumentation

Die Dokumentation in Datei C:\WinAVR\doc\avr-libc\avr-libc-user-manual-1.4.3.pdf ist zu beachten. Die Verwendung von inline-Assembler wird ab Seite pdf:181 besprochen. Freie Register werden in pdf:198 besprochen
Die Benutzung von Variablen, Registern und Speicher, und die Übergabe von Parameters muss dem Kompiler mitgeteilt werden. Die dazu erforderlichen Konstrukte sind da behandelt.


Siehe auch

../avrstud.htm - Anwendung des AVR-Stdio mit Gnu C++ - Compiler
ccall.htm - avr-g++ / avr-gcc : Norm für Unterprogrammaufrufe

WWW

http://www.cs.tut.fi/~sulat/8104150/harjtyo/linux_auto/documentation/tools.html -
http://www.roboternetz.de/wissen/index.php/Inline-Assembler_in_avr-gcc - Beschreibung im Roboternetz