Wer Mikrocontroller programmiert (Hardware-Programmierung), sollte sich unbedingt mit der Programmierung in Assembler auskennen. In vielen Fällen ist es z.B. sehr wichtig das man genau weiss, welche Zeit ein Programm-Teil zur Auführung benötigt (zeitkritische Funktionen z.B. in Interrupt-Funktionen). Viele Fehler in einem C-Programm lassen sich durch einen Blick in die vom C-Compiler (GCC) erzeugte Assembler-Listdatei schnell auffinden (z.B. wegoptimierte Zeitschleifen usw.). Zur Erklärung (vereinfachte Darstellung): Der C-Compiler (GCC) erzeugt aus dem Quelltext, dem C-Programm-Text, eine Assembler-Datei. Diese Datei wird vom Assembler assembliert und der Assembler erzeugt daraus eine Object-Datei (.o). Der Linker erzeugt aus dieser Object-Datei, oder wenn das Programm aus mehreren C-Projekt-Dateien besteht, Object-Dateien, das fertige Programm. In unserem Fall (GCC) erzeugt der Linker eine spezielle Datei mit der Endung .hex. Es ist natürlich auch möglich, Assembler-Dateien in ein Projekt mit aufzunehmen. Assembler-Text-Dateien haben die Datei-Endung .s (nicht .c!). Wenn man z.B. im AVR-Studio für das aktuelles Projekt unter dem Menüpunkt: [Project][Configuration Options] die Option „Generate List File“ aktiviert (Häkchen unten rechts), wird bei der Compilierung des Projekts zusätzlich eine Assembler-List-Datei erzeugt. Diese Datei findet ihr dann in dem Projektordner [Other Files] mit der Datei-Endung .lss. Als Beispiel könnt ihr ja mal überprüfen, welches Assembler-Programm für eine Schleife in C bei den verschiedenen Optimierungs-Stufen des Compilers erzeugt wird. Die Optimierungs-Stufe wird im Projekt im AVR-Studio unter dem Menüpunkt: [Project][Configuration Options] Optimization eingestellt. Die Optimierung -Os steht z.B. für SIZE, also Programmgröße. Der Compiler versucht das fertige Programm so klein wie möglich zu erstellen. In der .lss-Datei müsst ihr nach der Zeile in der eure main()-Funktion beginnt suchen. Darunter befindet sich dann die for-Schleife. Bei entsprechendem Interesse, kann man ja das Thema „Assembler-Programmierung von Mikrocontrollern“ hier im Forum erweitern!

Das C-Programm für den Test:
Code:
#include <avr/io.h>

unsigned int i;

int main(void)
{
	for(i=1; i; i++)
	;
}
Code:
Compilierung mit Optimierungs-Stufe -O0
(Auszug aus der lss-Datei):

	for(i=1; i; i++)
  64:	81 e0       	ldi	r24, 0x01	; 1
  66:	90 e0       	ldi	r25, 0x00	; 0
  68:	90 93 61 00 	sts	0x0061, r25
  6c:	80 93 60 00 	sts	0x0060, r24
  70:	80 91 60 00 	lds	r24, 0x0060
  74:	90 91 61 00 	lds	r25, 0x0061
  78:	00 97       	sbiw	r24, 0x00	; 0
  7a:	51 f0       	breq	.+20     	; 0x90 <main+0x34>
  7c:	80 91 60 00 	lds	r24, 0x0060
  80:	90 91 61 00 	lds	r25, 0x0061
  84:	01 96       	adiw	r24, 0x01	; 1
  86:	90 93 61 00 	sts	0x0061, r25
  8a:	80 93 60 00 	sts	0x0060, r24
  8e:	f0 cf       	rjmp	.-32     	; 0x70 <main+0x14>
	
Compilierung mit Optimierungs-Stufe -Os:
(Auszug aus der lss-Datei):

	for(i=1; i; i++)
64:	81 e0       	ldi	r24, 0x01	; 1
66:	90 e0       	ldi	r25, 0x00	; 0
68:	90 93 61 00 	sts	0x0061, r25
6c:	80 93 60 00 	sts	0x0060, r24
70:	01 96       	adiw	r24, 0x01	; 1
72:	f1 f7       	brne	.-4      		; 0x70 <main+0x14>
74:	90 93 61 00 	sts	0x0061, r25
78:	80 93 60 00 	sts	0x0060, r24
Viel Erfolg: Peter (Ronny10)