<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
		<id>https://rn-wissen.de/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=MrByte</id>
		<title>RN-Wissen.de - Benutzerbeiträge [de]</title>
		<link rel="self" type="application/atom+xml" href="https://rn-wissen.de/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=MrByte"/>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Spezial:Beitr%C3%A4ge/MrByte"/>
		<updated>2026-04-11T20:44:57Z</updated>
		<subtitle>Benutzerbeiträge</subtitle>
		<generator>MediaWiki 1.25.1</generator>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Codevergleich_AVR-Compiler&amp;diff=14555</id>
		<title>Codevergleich AVR-Compiler</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Codevergleich_AVR-Compiler&amp;diff=14555"/>
				<updated>2009-02-09T20:22:39Z</updated>
		
		<summary type="html">&lt;p&gt;MrByte: /* Berechnung durch Formel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein wichtiges Merkmal eines [[Compiler]]s ist die Güte des erzeugten Codes.&lt;br /&gt;
Immerhin will man seine Hardware optimal nutzen, und die geschriebenen Programme sollen möglichst wenig Laufzeit brauchen und möglichst wenig Speicher &amp;amp;ndash; also RAM und [[Flash]] &amp;amp;ndash; belegen.&lt;br /&gt;
&lt;br /&gt;
{{Ausbauwunsch|Bascom Beispiele}}&lt;br /&gt;
&lt;br /&gt;
Ein Vergleich der erzeugten Codes ist jedoch nicht einfach, denn ein Problem kann bereits innerhalb ein und der selben Programmiersprache auf sehr unterschiedliche Art und Weisen formuliert oder gelöst werden.&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel versucht ansatzweise einen Codevergleich weit verbreiteter [[AVR]]-Compiler anhand sehr einfacher Aufgaben, die &amp;quot;geradeaus&amp;quot; und ohne Umschweife programmiert wurden. &lt;br /&gt;
&lt;br /&gt;
Ein Vergleich der Programmierung von Hardware-Komponenten und Peripherie wie [[Timer]]-, [[UART]]- oder [[I2C]]-Module scheint dabei weniger interessant, denn obwohl die Codes zum Steuern dieser Komponente in unterschiedlichen Sprachen recht verschieden aussehen, werden sie doch auf die selben Maschinen-Codes abgebildet, die sich im wesentlichen auf das Setzen und Lesen von Registern (SFRs) reduzieren. &lt;br /&gt;
&lt;br /&gt;
Neben diesen für jedes Programm essenziellen Abschnitten besteht ein Programm aber zum großen Teil aus hardwareunabhängigen Aufgaben wie Registerverwaltung, Funktionsaufrufen, Schleifen, Abfragen, Zuweisungen, Parameterübergaben, Abfragen von Bedingungen, Arithmetik, Implementierung von [[Interrupt Service Routine]]n, etc.&lt;br /&gt;
&lt;br /&gt;
Interessanter erscheint ein Vergleich einfacher Aufgaben, die erkennen lassen, wie gut ein Compiler in der Lage ist, die Ressourcen eines [[Mikrocontroller]]s zu nutzen bzw. zu schonen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Rahmenbedingungen =&lt;br /&gt;
&lt;br /&gt;
;[[avr-gcc]]: Die Assembler-Ausgaben wurden mit der Optimierungsstufe &amp;quot;auf Größe optimieren&amp;quot; (&amp;lt;tt&amp;gt;-Os&amp;lt;/tt&amp;gt;) für einen [[ATmega8]] erstellt. [[GCC]]-Version war 3.4.x. Andere Optimierungsstufen haben wenig bis keinen Einfluss auf den erzeugtenCode. Codes für andere Controller der ATmega-Familie unterscheiden sich praktisch nicht vom ATmega8-Code.&lt;br /&gt;
&lt;br /&gt;
:Die acr-gcc Assembler-Dumps wurden erzeugt mit&lt;br /&gt;
:{|&lt;br /&gt;
|-&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; avr-gcc -mmcu=atmega8 -g -Os datei.c -c -o datei.o&lt;br /&gt;
&amp;gt; avr-objdump -d -S datei.o&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
(Zu beachten ist, daß &amp;lt;tt&amp;gt;datei.o&amp;lt;/tt&amp;gt; ein noch nicht loktiertes Objekt ist und daher Adressen noch mit Platzhaltern (üblicherweise 0) gefüllt sind und daher im Dump noch als 0 angezeigt werden.)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;[[Bascom]]: Das einzige Assembler-Code-Listing von Bascom (Aufsummieren in einer Schleife) wurde von PicNick mit einem selbstgestrickten *.HEX File Analyzer erstellt, da der Disassembler von AVR-Studio etwas schwer lesbar ist.&lt;br /&gt;
&lt;br /&gt;
;[[Keil-ARM7]]: Es wurden einige weitere Codezeilen für ein RISC ARM7 System (LPC2138) mit Keil Compiler jeweils unter die gcc-avr Varianten gestellt um auch hier einen Vergleich außerhalb der Konkurrenz gcc-avr/Bascom ziehen zu können. Die Optimierung lag auf 'speed' und Registeroptimierung. Man sieht gewisse Ähnlichkeiten zwischen gcc-avr und Keil-Arm7, im Detail sind die Aufgaben jedoch unterschiedlich gelöst. Auf Grund von deutlichen Unterschieden z.B. im Interrupt Handling sind die Codebeispiele teilweise nicht 1:1 vergleichbar. Die Codebeispiele sind ebenfalls noch nicht loktierte / gelinkte Objekte. Siehe oben.&lt;br /&gt;
&lt;br /&gt;
= Summe der ersten ''n'' Zahlen =&lt;br /&gt;
&lt;br /&gt;
Berechnet wird die Summe der ersten ''n'' Zahlen:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\operatorname{sum}(n) \,=\, \sum_{k=1}^n k &lt;br /&gt;
     \,=\, 1 + 2 + \ldots + n&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Zahl ''n'' wird als 16-Bit Zahl angegeben und das Ergebnis als 16-Bit-Zahl berechnet. Ein eventueller Überlauf wird nicht beachtet.&lt;br /&gt;
&lt;br /&gt;
Der Code wird jeweils als eigene Funktion implementiert, um Abhängigkeiten vom umliegenden Code zu vermeiden.&lt;br /&gt;
&lt;br /&gt;
Für diese Berechnung gibt es mehrere Möglichkeiten.&lt;br /&gt;
&lt;br /&gt;
== Aufsummieren in einer Schleife ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{Codevergleich|avr-gcc|BASCOM&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Quellcodes:'''&lt;br /&gt;
&lt;br /&gt;
{{Codevergleich|avr-gcc|BASCOM&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
unsigned int &lt;br /&gt;
sum_n_loop (unsigned int n)&lt;br /&gt;
{&lt;br /&gt;
   unsigned int sum = 0;&lt;br /&gt;
   unsigned int i;&lt;br /&gt;
&lt;br /&gt;
   for (i=n; i &amp;gt; 0; i--)&lt;br /&gt;
      sum += i;&lt;br /&gt;
	&lt;br /&gt;
   return sum;	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Declare Function Sum_n_loop(byval N As Integer) As Integer&lt;br /&gt;
&lt;br /&gt;
Dim X As Integer&lt;br /&gt;
&lt;br /&gt;
'Start&lt;br /&gt;
   X = Sum_n_loop(10)&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
' -----&lt;br /&gt;
&lt;br /&gt;
Function Sum_n_loop(byval N As Integer) As Integer&lt;br /&gt;
   Sum_n_loop = 0&lt;br /&gt;
   While N &amp;gt; 0&lt;br /&gt;
      Sum_n_loop = Sum_n_loop + N&lt;br /&gt;
      Decr N&lt;br /&gt;
   Wend&lt;br /&gt;
End Function&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
'''Compilat:'''&lt;br /&gt;
&lt;br /&gt;
{{Codevergleich|avr-gcc|BASCOM&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
00000000 &amp;lt;sum_n_loop&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
unsigned int &lt;br /&gt;
sum_n_loop (unsigned int n)&lt;br /&gt;
{&lt;br /&gt;
   unsigned int sum = 0;&lt;br /&gt;
   0:	ldi	r18, 0x00&lt;br /&gt;
   2:	ldi	r19, 0x00&lt;br /&gt;
   unsigned int i;&lt;br /&gt;
&lt;br /&gt;
   for (i=n; i &amp;gt; 0; i--)&lt;br /&gt;
   4:	sbiw	r24, 0x00&lt;br /&gt;
   6:	breq	.+8   ; 0x10&lt;br /&gt;
      sum += i;&lt;br /&gt;
   8:	add	r18, r24&lt;br /&gt;
   a:	adc	r19, r25&lt;br /&gt;
   c:	sbiw	r24, 0x01&lt;br /&gt;
   e:	rjmp	.-12  ; 0x4&lt;br /&gt;
	&lt;br /&gt;
   return sum;	&lt;br /&gt;
}&lt;br /&gt;
  10:	movw	r24, r18&lt;br /&gt;
  12:	ret&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
das Ganze aus Spass auch noch als Keil-ARM7 Code&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
*** CODE SEGMENT '?PR?sum_n_loop?A?main':&lt;br /&gt;
  283: unsigned int sum_n_loop (unsigned int n)&lt;br /&gt;
 00  MOV         R2,R0 ; n&lt;br /&gt;
  284: {&lt;br /&gt;
  285:    unsigned int sum = 0;&lt;br /&gt;
 04  MOV         R1,#0x0&lt;br /&gt;
  288:    for (i=n; i &amp;gt; 0; i--)&lt;br /&gt;
 08  MOV         R0,R2 ; n&lt;br /&gt;
 0C  B           L_11  ; Targ=0x1C&lt;br /&gt;
 10          L_12:&lt;br /&gt;
  289:       sum += i;&lt;br /&gt;
 10  MOV         R2,R0 ; i&lt;br /&gt;
 14  ADD         R1,R1,R2 ; sum&lt;br /&gt;
 18  SUB         R0,R0,#0x0001 ; i&lt;br /&gt;
 1C  L_11:&lt;br /&gt;
 1C  MOV         R2,R0 ; i&lt;br /&gt;
 20  CMP         R2,#0x0000 ; i&lt;br /&gt;
 24  BHI         L_12  ; Targ=0x10&lt;br /&gt;
  291:    return sum;  &lt;br /&gt;
 28  MOV         R0,R1 ; sum&lt;br /&gt;
  292: }&lt;br /&gt;
 2C  BX          R14&lt;br /&gt;
 30  ENDP ; 'sum_n_loop?A'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;---------------------------------------------------------&lt;br /&gt;
;   Function Sum_n_loop(byval N As Integer) As Integer&lt;br /&gt;
;---------------------------------------------------------&lt;br /&gt;
L_0x00B4:&lt;br /&gt;
&lt;br /&gt;
;---------------------------------------------------------&lt;br /&gt;
;   Sum_n_loop = 0&lt;br /&gt;
;---------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
	LDI	r24,0x00    ; clear&lt;br /&gt;
	LDI	r25,0x00    ; &lt;br /&gt;
	LDD	XL,Y + 2    ; return value addr (softstack)&lt;br /&gt;
	LDD	XH,Y + 3&lt;br /&gt;
	ST	X+,r24      ;  &lt;br /&gt;
	ST	X,r25&lt;br /&gt;
&lt;br /&gt;
L_0x00C0:&lt;br /&gt;
&lt;br /&gt;
;---------------------------------------------------------&lt;br /&gt;
;   While N &amp;gt; 0&lt;br /&gt;
;---------------------------------------------------------&lt;br /&gt;
	LDD	XL,Y + 0  ; argument addr (softstack)&lt;br /&gt;
	LDD	XH,Y + 1&lt;br /&gt;
	LD	r16,X+    ; load r16:r17&lt;br /&gt;
	LD	r17,X&lt;br /&gt;
	CPI	r16,0x00   ; LOW  &amp;lt;&amp;gt; 0 ?&lt;br /&gt;
	LDI	r21,0x00   &lt;br /&gt;
	CPC	r17,r21    ; HIGH &amp;lt;&amp;gt; 0 ? &lt;br /&gt;
	BRLT	L_0x00D6   ; branch lower  -&amp;gt;function exit&lt;br /&gt;
	BREQ	L_0x00D6   ; branch equal  -&amp;gt;function exit&lt;br /&gt;
	JMP	L_0x00DA   ; continue&lt;br /&gt;
L_0x00D6:&lt;br /&gt;
	JMP	L_0x0102   ; jmp function exit&lt;br /&gt;
&lt;br /&gt;
L_0x00DA:&lt;br /&gt;
;---------------------------------------------------------&lt;br /&gt;
;      Sum_n_loop = Sum_n_loop + N&lt;br /&gt;
;---------------------------------------------------------&lt;br /&gt;
	LDD	XL,Y + 2   ; summ_n_loop &lt;br /&gt;
	LDD	XH,Y + 3&lt;br /&gt;
	LD	r16,X+     ; into r16:r17&lt;br /&gt;
	LD	r17,X&lt;br /&gt;
	LDD	XL,Y + 0   ; N&lt;br /&gt;
	LDD	XH,Y + 1&lt;br /&gt;
	LD	r20,X+     ; into r20:r21&lt;br /&gt;
	LD	r21,X&lt;br /&gt;
	ADD	r16,r20    ; add      r16, r20&lt;br /&gt;
	ADC	r17,r21    ; add+cy   r17, r21&lt;br /&gt;
	LDD	XL,Y + 2   ; &lt;br /&gt;
	LDD	XH,Y + 3&lt;br /&gt;
	ST	X+,r16     ; store sum&lt;br /&gt;
	ST	X,r17&lt;br /&gt;
;---------------------------------------------------------&lt;br /&gt;
;      Decr N&lt;br /&gt;
;---------------------------------------------------------&lt;br /&gt;
	LDD	XL,Y + 0&lt;br /&gt;
	LDD	XH,Y + 1&lt;br /&gt;
	CALL	L_0x0114&lt;br /&gt;
;---------------------------------------------------------&lt;br /&gt;
;   Wend&lt;br /&gt;
;---------------------------------------------------------&lt;br /&gt;
	JMP	L_0x00C0 ; reenter loop&lt;br /&gt;
;---------------------------------------------------------&lt;br /&gt;
L_0x0102:&lt;br /&gt;
	RET      ; end function&lt;br /&gt;
;---------------------------------------------------------&lt;br /&gt;
; library function : decrement integer&lt;br /&gt;
;---------------------------------------------------------&lt;br /&gt;
L_0x0114:&lt;br /&gt;
	LD	ZL,X+&lt;br /&gt;
	LD	ZH,X&lt;br /&gt;
	SBIW	ZL,0x0001&lt;br /&gt;
	ST	X,ZH&lt;br /&gt;
	ST	-X,ZL&lt;br /&gt;
	RET&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Remark''': Das reine Register-rechnen (GCC) macht Bascom nicht. Er arbeitet immer im SRAM , brav mit Load &amp;amp; Store. (PicNick)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Berechnung mit rekursiver Funktion ==&lt;br /&gt;
&lt;br /&gt;
'''Quellcodes:'''&lt;br /&gt;
&lt;br /&gt;
{{Codevergleich|avr-gcc|BASCOM&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
unsigned int &lt;br /&gt;
sum_n_rekursiv (unsigned int n)&lt;br /&gt;
{&lt;br /&gt;
   if (n == 0)&lt;br /&gt;
      return 0;&lt;br /&gt;
&lt;br /&gt;
   return n + sum_n_rekursiv (n-1);	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
???&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
'''Compilat:'''&lt;br /&gt;
&lt;br /&gt;
{{Codevergleich|avr-gcc|BASCOM&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
00000000 &amp;lt;sum_n_rekursiv&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
unsigned int &lt;br /&gt;
sum_n_rekursiv (unsigned int n)&lt;br /&gt;
{&lt;br /&gt;
   0:	push	r28&lt;br /&gt;
   2:	push	r29&lt;br /&gt;
   4:	movw	r28, r24&lt;br /&gt;
   if (n == 0)&lt;br /&gt;
   6:	sbiw	r24, 0x00&lt;br /&gt;
   8:	breq	.+8     ; 0x12&lt;br /&gt;
      return 0;&lt;br /&gt;
&lt;br /&gt;
   return n + sum_n_rekursiv (n-1);	&lt;br /&gt;
   a:	sbiw	r24, 0x01&lt;br /&gt;
   c:	rcall	.-14    ; 0x0&lt;br /&gt;
   e:	add	r24, r28&lt;br /&gt;
  10:	adc	r25, r29&lt;br /&gt;
}  &lt;br /&gt;
  12:	pop	r29&lt;br /&gt;
  14:	pop	r28&lt;br /&gt;
  16:	ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
daraus macht der Keil-ARM7 folgendes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
*** CODE SEGMENT '?PR?sum_n_rekursiv?A?main':&lt;br /&gt;
  283: unsigned int sum_n_rekursiv (unsigned int n)&lt;br /&gt;
 00  STMDB       R13!,{R4,LR}&lt;br /&gt;
 04  MOV         R4,R0 ; n&lt;br /&gt;
  285:    if (n == 0)&lt;br /&gt;
 08  MOV         R0,R4 ; n&lt;br /&gt;
 0C  CMP         R0,#0x0000 ; n&lt;br /&gt;
 10  BNE         L_9  ; Targ=0x1C&lt;br /&gt;
  286:       return 0;&lt;br /&gt;
 14  MOV         R0,#0x0&lt;br /&gt;
 18  B           L_10  ; Targ=0x30&lt;br /&gt;
 1C          L_9:&lt;br /&gt;
  288:    return n + sum_n_rekursiv (n-1); &lt;br /&gt;
 1C  MOV         R0,R4 ; n&lt;br /&gt;
 20  SUB         R0,R0,#0x0001 ; n&lt;br /&gt;
 24  BL          sum_n_rekursiv?A  ; Targ=0x0&lt;br /&gt;
 28  MOV         R1,R4 ; n&lt;br /&gt;
 2C  ADD         R0,R1,R0 ; n&lt;br /&gt;
  289: }&lt;br /&gt;
 30          L_10:&lt;br /&gt;
 30  LDMIA       R13!,{R4}&lt;br /&gt;
 34  LDMIA       R13!,{R3}&lt;br /&gt;
 38  BX          R3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
???&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Berechnung durch Formel ==&lt;br /&gt;
&lt;br /&gt;
'''Quellcodes:'''&lt;br /&gt;
{{Codevergleich|avr-gcc|BASCOM&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
unsigned int &lt;br /&gt;
sum_n_formel (unsigned int n)&lt;br /&gt;
{&lt;br /&gt;
   return n*(n+1) / 2;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Bascom mag keine Formeln. Diese müssen erst zerlegt werden. &lt;br /&gt;
Ob diese Art der Berechnug schlechter ist kann so nicht gesagt&lt;br /&gt;
werden. Auf jedem Fall ist diese Methode nicht elegant und&lt;br /&gt;
ziemlich unübersichtlich, da der Zusammenhang verloren geht.&lt;br /&gt;
&lt;br /&gt;
Declare Function Sum_n_formel(byval I As Integer) As Integer&lt;br /&gt;
&lt;br /&gt;
Dim X As Integer&lt;br /&gt;
&lt;br /&gt;
'Start&lt;br /&gt;
&lt;br /&gt;
   X = Sum_n_formel(10)&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
' -----&lt;br /&gt;
&lt;br /&gt;
Function Sum_n_formel(byval I As Integer)&lt;br /&gt;
&lt;br /&gt;
   X = I + 1             '(n+1)&lt;br /&gt;
   X = X * I             'n * (n+1)&lt;br /&gt;
&lt;br /&gt;
   Sum_n_formel = X / 2  'n * (n+1) / 2&lt;br /&gt;
&lt;br /&gt;
End Function&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Codevergleich|avr-gcc|BASCOM&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
00000000 &amp;lt;sum_n_formel&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
unsigned int &lt;br /&gt;
sum_n_formel (unsigned int n)&lt;br /&gt;
{&lt;br /&gt;
   return n*(n+1) / 2;&lt;br /&gt;
   0:	mul	r24, r24&lt;br /&gt;
   2:	movw	r18, r0&lt;br /&gt;
   4:	mul	r24, r25&lt;br /&gt;
   6:	add	r19, r0&lt;br /&gt;
   8:	mul	r25, r24&lt;br /&gt;
   a:	add	r19, r0&lt;br /&gt;
   c:	eor	r1, r1&lt;br /&gt;
   e:	add	r18, r24&lt;br /&gt;
  10:	adc	r19, r25&lt;br /&gt;
}&lt;br /&gt;
  12:	movw	r24, r18&lt;br /&gt;
  14:	lsr	r25&lt;br /&gt;
  16:	ror	r24&lt;br /&gt;
  18:	ret&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Es geht auch mit deutlich weniger Registern im ARM7&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
*** CODE SEGMENT '?PR?sum_n_formel?A?main':&lt;br /&gt;
  284: sum_n_formel (unsigned int n)&lt;br /&gt;
 00  MOV         R2,R0 ; n&lt;br /&gt;
  286:    return n*(n+1) / 2;&lt;br /&gt;
 04  MOV         R1,R2 ; n&lt;br /&gt;
 08  ADD         R1,R1,#0x0001 ; n&lt;br /&gt;
 0C  MOV         R0,R2 ; n&lt;br /&gt;
 10  MUL         R0,R1,R0&lt;br /&gt;
 14  MOV         R0,R0,LSR #1&lt;br /&gt;
  287: }&lt;br /&gt;
 18  BX          R14&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
???&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Interrupt-Routinen=&lt;br /&gt;
Auch diese Beispiele machen nicht viel. Das erste zählt nur eine 16-Bit Variable hoch, das zweite macht nichts weiter, als ein Funktionsaufruf.&lt;br /&gt;
&lt;br /&gt;
==Eine Variable hochzählen==&lt;br /&gt;
&lt;br /&gt;
'''Quellcodes:'''&lt;br /&gt;
&lt;br /&gt;
{{Codevergleich|avr-gcc|BASCOM&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/signal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int volatile count;&lt;br /&gt;
&lt;br /&gt;
SIGNAL (SIG_OVERFLOW0)&lt;br /&gt;
{&lt;br /&gt;
   count++;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
'''Compilat:'''&lt;br /&gt;
&lt;br /&gt;
{{Codevergleich|avr-gcc|BASCOM&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
__vector_9:&lt;br /&gt;
   push __zero_reg__&lt;br /&gt;
   push __tmp_reg__&lt;br /&gt;
   in __tmp_reg__,__SREG__&lt;br /&gt;
   push __tmp_reg__&lt;br /&gt;
   clr __zero_reg__&lt;br /&gt;
   push r24&lt;br /&gt;
   push r25&lt;br /&gt;
&lt;br /&gt;
   lds r24,count&lt;br /&gt;
   lds r25,(count)+1&lt;br /&gt;
   adiw r24,1&lt;br /&gt;
   sts (count)+1,r25&lt;br /&gt;
   sts count,r24&lt;br /&gt;
&lt;br /&gt;
   pop r25&lt;br /&gt;
   pop r24&lt;br /&gt;
   pop __tmp_reg__&lt;br /&gt;
   out __SREG__,__tmp_reg__&lt;br /&gt;
   pop __tmp_reg__&lt;br /&gt;
   pop __zero_reg__&lt;br /&gt;
   reti&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Variable holen, addieren, wegschreiben.. den Rest macht der ARM7 selbst. Viel interessanter ist, das der ARM den Counter in ein Register kriegt, der AVR aber über 2 Register rechnen muss (r24 und r25). Dafür muss aber der Arm 2 LDR ausführen um an die Countervariable zu kommen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
*** CODE SEGMENT '?PR?ISR?A?main':&lt;br /&gt;
  288:     count++;&lt;br /&gt;
 00  LDR         R0,=count ; count&lt;br /&gt;
 04  LDR         R1,[R0,#0x0] ; count&lt;br /&gt;
 08  ADD         R1,R1,#0x0001&lt;br /&gt;
 0C  STR         R1,[R0,#0x0] ; count&lt;br /&gt;
 10  BX          R14&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Der Code ist auf Grund der Architektur nicht direkt vergleichbar mit dem AVR. Der Arm 7 besitzt einen eigenen Interrupt Stack, Befehle um ganze Registersätze zu popen/puschen, einen Vectorinterruptcontroller und User/Supervisor Prioritätsebenen, ähnlich der einer x86 CPU. Das wäre als wolle man avr-gcc und Bascom vergleichen :)&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Eine Funktion aufrufen==&lt;br /&gt;
&lt;br /&gt;
'''Quellcodes:'''&lt;br /&gt;
{{Codevergleich|avr-gcc|BASCOM&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/signal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
extern void foo();&lt;br /&gt;
&lt;br /&gt;
SIGNAL (SIG_OVERFLOW1)&lt;br /&gt;
{&lt;br /&gt;
   foo();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Compilat:'''&lt;br /&gt;
&lt;br /&gt;
{{Codevergleich|avr-gcc|BASCOM&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
__vector_8:&lt;br /&gt;
   push __zero_reg__&lt;br /&gt;
   push __tmp_reg__&lt;br /&gt;
   in __tmp_reg__,__SREG__&lt;br /&gt;
   push __tmp_reg__&lt;br /&gt;
   clr __zero_reg__&lt;br /&gt;
   push r18&lt;br /&gt;
   push r19&lt;br /&gt;
   push r20&lt;br /&gt;
   push r21&lt;br /&gt;
   push r22&lt;br /&gt;
   push r23&lt;br /&gt;
   push r24&lt;br /&gt;
   push r25&lt;br /&gt;
   push r26&lt;br /&gt;
   push r27&lt;br /&gt;
   push r30&lt;br /&gt;
   push r31&lt;br /&gt;
&lt;br /&gt;
   rcall foo&lt;br /&gt;
&lt;br /&gt;
   pop r31&lt;br /&gt;
   pop r30&lt;br /&gt;
   pop r27&lt;br /&gt;
   pop r26&lt;br /&gt;
   pop r25&lt;br /&gt;
   pop r24&lt;br /&gt;
   pop r23&lt;br /&gt;
   pop r22&lt;br /&gt;
   pop r21&lt;br /&gt;
   pop r20&lt;br /&gt;
   pop r19&lt;br /&gt;
   pop r18&lt;br /&gt;
   pop __tmp_reg__&lt;br /&gt;
   out __SREG__,__tmp_reg__&lt;br /&gt;
   pop __tmp_reg__&lt;br /&gt;
   pop __zero_reg__&lt;br /&gt;
   reti&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Und hier der Arm 7 Code.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
*** CODE SEGMENT '?PR?ISR?A?main':&lt;br /&gt;
  285: void ISR( void )&lt;br /&gt;
 00  STMDB       R13!,{LR}&lt;br /&gt;
  287:     foo();&lt;br /&gt;
 04  BL          foo?A  ; Targ=0x0&lt;br /&gt;
 08  LDMIA       R13!,{R3}&lt;br /&gt;
 0C  BX          R3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Der Code ist auf Grund der Architektur nicht direkt vergleichbar mit dem AVR.&lt;br /&gt;
Der Arm 7 besitzt einen eigenen Interrupt Stack, Befehle um ganze Registersätze zu popen/puschen, einen Vectorinterruptcontroller und User/Supervisor Prioritätsebenen, ähnlich der einer x86 CPU.&lt;br /&gt;
Das wäre als wolle man avr-gcc und Bascom vergleichen :)&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Sortieren mit Bubble-Sort =&lt;br /&gt;
&lt;br /&gt;
Zum Abschluss noch ein komplexeres Beispiel: Ein Array mit 8-Bit-Werten soll mit Bubble-Sort der Größe nach sortiert werden. &lt;br /&gt;
&lt;br /&gt;
Im Array wird nach dem größten Wert gesucht und dieser ans Ende getauscht. Danach macht man den Teilbereich, in dem man das Maximum sucht, um 1 kleiner, bis man fertig ist. Die größten Zahlen wandern wie Blasen nach oben, daher der Name ''Bubble-Sort'' für diesen Sortier-Algorithmus.&lt;br /&gt;
&lt;br /&gt;
'''Variablen:'''&lt;br /&gt;
* &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt; Array-Größe&lt;br /&gt;
* &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; das Array&lt;br /&gt;
* &amp;lt;tt&amp;gt;i&amp;lt;/tt&amp;gt; Größe der Teilbereichs&lt;br /&gt;
* &amp;lt;tt&amp;gt;j&amp;lt;/tt&amp;gt; Laufvariable durch den Teilbereich&lt;br /&gt;
&lt;br /&gt;
'''Quellcodes:'''&lt;br /&gt;
&lt;br /&gt;
{{Codevergleich|avr-gcc|BASCOM&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;limits.h&amp;gt;&lt;br /&gt;
#include &amp;lt;inttypes.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void &lt;br /&gt;
bubble_sort (uint8_t n, char * a)&lt;br /&gt;
{&lt;br /&gt;
   uint8_t i;&lt;br /&gt;
&lt;br /&gt;
   // Bereich schrumpft von n auf 2&lt;br /&gt;
   for (i = n; i &amp;gt;= 2; i--)&lt;br /&gt;
   {&lt;br /&gt;
      char max = CHAR_MIN;&lt;br /&gt;
      uint8_t j, j_max;&lt;br /&gt;
&lt;br /&gt;
      // im Bereich nach MAX suchen&lt;br /&gt;
      for (j = 0; j &amp;lt; i; j++)&lt;br /&gt;
      {&lt;br /&gt;
         if (a[j] &amp;gt;= max)&lt;br /&gt;
         {&lt;br /&gt;
            // MAX und Pos. merken&lt;br /&gt;
            j_max = j;&lt;br /&gt;
            max   = a[j_max];&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // MAX ans Ende tauschen&lt;br /&gt;
      a[j_max] = a[i-1];&lt;br /&gt;
      a[i-1]   = max;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
'''Compilat:'''&lt;br /&gt;
&lt;br /&gt;
{{Codevergleich|avr-gcc|BASCOM&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
00000000 &amp;lt;bubble_sort&amp;gt;:&lt;br /&gt;
{&lt;br /&gt;
   uint8_t i;&lt;br /&gt;
&lt;br /&gt;
   // Bereich schrumpft von n auf 2&lt;br /&gt;
   for (i = n; i &amp;gt;= 2; i--)&lt;br /&gt;
   0:	cpi	r24, 0x02&lt;br /&gt;
   2:	brcs	.+54     ; 0x3a&lt;br /&gt;
   4:	movw	r26, r22&lt;br /&gt;
   6:	add	r26, r24&lt;br /&gt;
   8:	adc	r27, r1&lt;br /&gt;
   a:	sbiw	r26, 0x01&lt;br /&gt;
   {&lt;br /&gt;
      char max = CHAR_MIN;&lt;br /&gt;
   c:	ldi	r20, 0x80&lt;br /&gt;
      uint8_t j, j_max;&lt;br /&gt;
&lt;br /&gt;
      // im Bereich nach MAX suchen&lt;br /&gt;
      for (j = 0; j &amp;lt; i; j++)&lt;br /&gt;
   e:	ldi	r19, 0x00&lt;br /&gt;
  10:	cp	r19, r24&lt;br /&gt;
  12:	brcc	.+18     ; 0x26&lt;br /&gt;
  14:	movw	r30, r22&lt;br /&gt;
      {&lt;br /&gt;
         if (a[j] &amp;gt;= max)&lt;br /&gt;
  16:	ld	r18, Z+&lt;br /&gt;
  18:	cp	r18, r20&lt;br /&gt;
  1a:	brlt	.+4      ; 0x20&lt;br /&gt;
         {&lt;br /&gt;
            // MAX und Pos. merken&lt;br /&gt;
            j_max = j;&lt;br /&gt;
  1c:	mov	r21, r19&lt;br /&gt;
            max   = a[j_max];&lt;br /&gt;
  1e:	mov	r20, r18&lt;br /&gt;
  20:	subi	r19, 0xFF&lt;br /&gt;
  22:	cp	r19, r24&lt;br /&gt;
  24:	brcs	.-16     ; 0x16&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // MAX ans Ende tauschen&lt;br /&gt;
      a[j_max] = a[i-1];&lt;br /&gt;
  26:	movw	r30, r22&lt;br /&gt;
  28:	add	r30, r21&lt;br /&gt;
  2a:	adc	r31, r1&lt;br /&gt;
  2c:	ld	r18, X&lt;br /&gt;
  2e:	st	Z, r18&lt;br /&gt;
      a[i-1]   = max;&lt;br /&gt;
  30:	st	X, r20&lt;br /&gt;
  32:	subi	r24, 0x01&lt;br /&gt;
  34:	sbiw	r26, 0x01&lt;br /&gt;
  36:	cpi	r24, 0x02&lt;br /&gt;
  38:	brcc	.-46     ; 0xc&lt;br /&gt;
  3a:	ret&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Und hier das Ganze noch mal als ARM7 Code&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
*** CODE SEGMENT '?PR?bubble_sort?A?main':&lt;br /&gt;
  285: void bubble_sort (uint8_t n, char * a)&lt;br /&gt;
 00  STMDB       R13!,{R4-R6}&lt;br /&gt;
 04  MOV         R3,R0 ; n&lt;br /&gt;
  286: {&lt;br /&gt;
  290:    for (i = n; i &amp;gt;= 2; i--)&lt;br /&gt;
 08  MOV         R0,R3 ; n&lt;br /&gt;
 0C  B           L_11  ; Targ=0xD4&lt;br /&gt;
 10          L_12:&lt;br /&gt;
  291:    {&lt;br /&gt;
  292:       char max = CHAR_MIN;&lt;br /&gt;
 10  MOV         R3,#0x0&lt;br /&gt;
 14  MOV         R6,R3 ; max&lt;br /&gt;
  296:       for (j = 0; j &amp;lt; i; j++)&lt;br /&gt;
 18  B           L_16  ; Targ=0x64&lt;br /&gt;
 1C          L_17:&lt;br /&gt;
  298:          if (a[j] &amp;gt;= max)&lt;br /&gt;
 1C  MOV         R4,R3 ; j&lt;br /&gt;
 20  MOV         R5,R4,LSL #24 ; j&lt;br /&gt;
 24  MOV         R5,R5,LSR #24&lt;br /&gt;
 28  MOV         R4,R1 ; a&lt;br /&gt;
 2C  LDRB        R4,[R4,+R5]&lt;br /&gt;
 30  MOV         R5,R6 ; max&lt;br /&gt;
 34  MOV         R5,R5,LSL #24 ; max&lt;br /&gt;
 38  MOV         R5,R5,LSR #24&lt;br /&gt;
 3C  CMP         R4,R5&lt;br /&gt;
 40  BCC         L_14  ; Targ=0x5C&lt;br /&gt;
  301:             j_max = j;&lt;br /&gt;
 44  MOV         R2,R3 ; j&lt;br /&gt;
  302:             max   = a[j_max];&lt;br /&gt;
 48  MOV         R4,R2 ; j_max&lt;br /&gt;
 4C  MOV         R5,R4,LSL #24 ; j_max&lt;br /&gt;
 50  MOV         R5,R5,LSR #24&lt;br /&gt;
 54  MOV         R4,R1 ; a&lt;br /&gt;
 58  LDRB        R6,[R4,+R5]&lt;br /&gt;
  304:       }&lt;br /&gt;
 5C          L_14:&lt;br /&gt;
 5C  ADD         R3,R3,#0x0001 ; j&lt;br /&gt;
 60  AND         R3,R3,#0x00FF&lt;br /&gt;
 64          L_16:&lt;br /&gt;
 64  MOV         R4,R0 ; i&lt;br /&gt;
 68  MOV         R5,R4,LSL #24 ; i&lt;br /&gt;
 6C  MOV         R5,R5,LSR #24&lt;br /&gt;
 70  MOVR        R4,R3 ; j&lt;br /&gt;
 74  MOV         R4,R4,LSL #24 ; j&lt;br /&gt;
 78  MOV         R4,R4,LSR #24&lt;br /&gt;
 7C  CMP         R4,R5&lt;br /&gt;
 80  BCC         L_17  ; Targ=0x1C&lt;br /&gt;
  307:       a[j_max] = a[i-1];&lt;br /&gt;
 84  MOV         R3,R0 ; i&lt;br /&gt;
 88  MOV         R4,R3,LSL #24 ; i&lt;br /&gt;
 8C  MOV         R4,R4,LSR #24&lt;br /&gt;
 90  MOV         R3,R1 ; a&lt;br /&gt;
 94  ADD         R3,R3,R4 ; a&lt;br /&gt;
 98  LDRB        R3,[R3,#0xFFFFFFFF]&lt;br /&gt;
 9C  MOV         R4,R2 ; j_max&lt;br /&gt;
 A0  MOV         R5,R4,LSL #24 ; j_max&lt;br /&gt;
 A4  MOV         R5,R5,LSR #24&lt;br /&gt;
 A8  MOV         R4,R1 ; a&lt;br /&gt;
 AC  STRB        R3,[R4,+R5]&lt;br /&gt;
  308:       a[i-1]   = max;&lt;br /&gt;
 B0  MOV         R3,R6 ; max&lt;br /&gt;
 B4  MOV         R4,R0 ; i&lt;br /&gt;
 B8  MOV         R5,R4,LSL #24 ; i&lt;br /&gt;
 BC  MOV         R5,R5,LSR #24&lt;br /&gt;
 C0  MOV         R4,R1 ; a&lt;br /&gt;
 C4  ADD         R4,R4,R5 ; a&lt;br /&gt;
 C8  STRB        R3,[R4,#0xFFFFFFFF]&lt;br /&gt;
  309:    }&lt;br /&gt;
 CC  SUB         R0,R0,#0x0001 ; i&lt;br /&gt;
 D0  AND         R0,R0,#0x00FF&lt;br /&gt;
 D4          L_11:&lt;br /&gt;
 D4  MOV         R3,R0 ; i&lt;br /&gt;
 D8  MOV         R3,R3,LSL #24 ; i&lt;br /&gt;
 DC  MOV         R3,R3,LSR #24&lt;br /&gt;
 E0  CMP         R3,#0x0002&lt;br /&gt;
 E4  BGE         L_12  ; Targ=0x10&lt;br /&gt;
  310: }&lt;br /&gt;
 E8  LDMIA       R13!,{R4-R6}&lt;br /&gt;
 EC  BX          R14&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Die Codes wurden etwas nachkommentiert und -formatiert, um besser den Zusammenhang mit der Quelle durchblicken zu können.&lt;br /&gt;
&lt;br /&gt;
= Zusammenfassung =&lt;br /&gt;
&lt;br /&gt;
Für diese drei Summier-Routinen erhält man folgende Ergebnisse für Laufzeit und Platzverbrauch. Die Laufzeittest wurden gemacht für N=20, d.h. es wurden die ersten 20 ganzen Zahlen aufsummiert.&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! Verbrauch an Flash (in Bytes) || avr-gcc || BASCOM&lt;br /&gt;
|- &lt;br /&gt;
 |&amp;lt;tt&amp;gt;sum_n_loop&amp;lt;/tt&amp;gt; || 20 || ???&lt;br /&gt;
|- &lt;br /&gt;
 |&amp;lt;tt&amp;gt;sum_n_rekursiv&amp;lt;/tt&amp;gt; || 24 || ???&lt;br /&gt;
|- &lt;br /&gt;
 |&amp;lt;tt&amp;gt;sum_n_formel&amp;lt;/tt&amp;gt; || 26 || ???&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! Verbrauch an Zeit (in CPU-Zyklen) || avr-gcc || BASCOM&lt;br /&gt;
|-&lt;br /&gt;
 |&amp;lt;tt&amp;gt;sum_n_loop (20)&amp;lt;/tt&amp;gt; || 191 || ???&lt;br /&gt;
|- &lt;br /&gt;
 |&amp;lt;tt&amp;gt;sum_n_rekursiv (20)&amp;lt;/tt&amp;gt; || 477 || ???&lt;br /&gt;
|- &lt;br /&gt;
 |&amp;lt;tt&amp;gt;sum_n_formel (20)&amp;lt;/tt&amp;gt; || 19 || ???&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
* [[Sourcevergleich]]&lt;br /&gt;
* [[avr-gcc]]&lt;br /&gt;
* [[Bascom]]&lt;br /&gt;
* [[AVR]]&lt;br /&gt;
* [[ARM]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Quellcode Bascom]]&lt;br /&gt;
[[Kategorie:Quellcode C]]&lt;br /&gt;
[[Kategorie:Quellcode Assembler AVR]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:Praxis]]&lt;/div&gt;</summary>
		<author><name>MrByte</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Codevergleich_AVR-Compiler&amp;diff=14554</id>
		<title>Codevergleich AVR-Compiler</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Codevergleich_AVR-Compiler&amp;diff=14554"/>
				<updated>2009-02-09T20:20:46Z</updated>
		
		<summary type="html">&lt;p&gt;MrByte: /* Berechnung durch Formel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein wichtiges Merkmal eines [[Compiler]]s ist die Güte des erzeugten Codes.&lt;br /&gt;
Immerhin will man seine Hardware optimal nutzen, und die geschriebenen Programme sollen möglichst wenig Laufzeit brauchen und möglichst wenig Speicher &amp;amp;ndash; also RAM und [[Flash]] &amp;amp;ndash; belegen.&lt;br /&gt;
&lt;br /&gt;
{{Ausbauwunsch|Bascom Beispiele}}&lt;br /&gt;
&lt;br /&gt;
Ein Vergleich der erzeugten Codes ist jedoch nicht einfach, denn ein Problem kann bereits innerhalb ein und der selben Programmiersprache auf sehr unterschiedliche Art und Weisen formuliert oder gelöst werden.&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel versucht ansatzweise einen Codevergleich weit verbreiteter [[AVR]]-Compiler anhand sehr einfacher Aufgaben, die &amp;quot;geradeaus&amp;quot; und ohne Umschweife programmiert wurden. &lt;br /&gt;
&lt;br /&gt;
Ein Vergleich der Programmierung von Hardware-Komponenten und Peripherie wie [[Timer]]-, [[UART]]- oder [[I2C]]-Module scheint dabei weniger interessant, denn obwohl die Codes zum Steuern dieser Komponente in unterschiedlichen Sprachen recht verschieden aussehen, werden sie doch auf die selben Maschinen-Codes abgebildet, die sich im wesentlichen auf das Setzen und Lesen von Registern (SFRs) reduzieren. &lt;br /&gt;
&lt;br /&gt;
Neben diesen für jedes Programm essenziellen Abschnitten besteht ein Programm aber zum großen Teil aus hardwareunabhängigen Aufgaben wie Registerverwaltung, Funktionsaufrufen, Schleifen, Abfragen, Zuweisungen, Parameterübergaben, Abfragen von Bedingungen, Arithmetik, Implementierung von [[Interrupt Service Routine]]n, etc.&lt;br /&gt;
&lt;br /&gt;
Interessanter erscheint ein Vergleich einfacher Aufgaben, die erkennen lassen, wie gut ein Compiler in der Lage ist, die Ressourcen eines [[Mikrocontroller]]s zu nutzen bzw. zu schonen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Rahmenbedingungen =&lt;br /&gt;
&lt;br /&gt;
;[[avr-gcc]]: Die Assembler-Ausgaben wurden mit der Optimierungsstufe &amp;quot;auf Größe optimieren&amp;quot; (&amp;lt;tt&amp;gt;-Os&amp;lt;/tt&amp;gt;) für einen [[ATmega8]] erstellt. [[GCC]]-Version war 3.4.x. Andere Optimierungsstufen haben wenig bis keinen Einfluss auf den erzeugtenCode. Codes für andere Controller der ATmega-Familie unterscheiden sich praktisch nicht vom ATmega8-Code.&lt;br /&gt;
&lt;br /&gt;
:Die acr-gcc Assembler-Dumps wurden erzeugt mit&lt;br /&gt;
:{|&lt;br /&gt;
|-&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; avr-gcc -mmcu=atmega8 -g -Os datei.c -c -o datei.o&lt;br /&gt;
&amp;gt; avr-objdump -d -S datei.o&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
(Zu beachten ist, daß &amp;lt;tt&amp;gt;datei.o&amp;lt;/tt&amp;gt; ein noch nicht loktiertes Objekt ist und daher Adressen noch mit Platzhaltern (üblicherweise 0) gefüllt sind und daher im Dump noch als 0 angezeigt werden.)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;[[Bascom]]: Das einzige Assembler-Code-Listing von Bascom (Aufsummieren in einer Schleife) wurde von PicNick mit einem selbstgestrickten *.HEX File Analyzer erstellt, da der Disassembler von AVR-Studio etwas schwer lesbar ist.&lt;br /&gt;
&lt;br /&gt;
;[[Keil-ARM7]]: Es wurden einige weitere Codezeilen für ein RISC ARM7 System (LPC2138) mit Keil Compiler jeweils unter die gcc-avr Varianten gestellt um auch hier einen Vergleich außerhalb der Konkurrenz gcc-avr/Bascom ziehen zu können. Die Optimierung lag auf 'speed' und Registeroptimierung. Man sieht gewisse Ähnlichkeiten zwischen gcc-avr und Keil-Arm7, im Detail sind die Aufgaben jedoch unterschiedlich gelöst. Auf Grund von deutlichen Unterschieden z.B. im Interrupt Handling sind die Codebeispiele teilweise nicht 1:1 vergleichbar. Die Codebeispiele sind ebenfalls noch nicht loktierte / gelinkte Objekte. Siehe oben.&lt;br /&gt;
&lt;br /&gt;
= Summe der ersten ''n'' Zahlen =&lt;br /&gt;
&lt;br /&gt;
Berechnet wird die Summe der ersten ''n'' Zahlen:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\operatorname{sum}(n) \,=\, \sum_{k=1}^n k &lt;br /&gt;
     \,=\, 1 + 2 + \ldots + n&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Zahl ''n'' wird als 16-Bit Zahl angegeben und das Ergebnis als 16-Bit-Zahl berechnet. Ein eventueller Überlauf wird nicht beachtet.&lt;br /&gt;
&lt;br /&gt;
Der Code wird jeweils als eigene Funktion implementiert, um Abhängigkeiten vom umliegenden Code zu vermeiden.&lt;br /&gt;
&lt;br /&gt;
Für diese Berechnung gibt es mehrere Möglichkeiten.&lt;br /&gt;
&lt;br /&gt;
== Aufsummieren in einer Schleife ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{Codevergleich|avr-gcc|BASCOM&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Quellcodes:'''&lt;br /&gt;
&lt;br /&gt;
{{Codevergleich|avr-gcc|BASCOM&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
unsigned int &lt;br /&gt;
sum_n_loop (unsigned int n)&lt;br /&gt;
{&lt;br /&gt;
   unsigned int sum = 0;&lt;br /&gt;
   unsigned int i;&lt;br /&gt;
&lt;br /&gt;
   for (i=n; i &amp;gt; 0; i--)&lt;br /&gt;
      sum += i;&lt;br /&gt;
	&lt;br /&gt;
   return sum;	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Declare Function Sum_n_loop(byval N As Integer) As Integer&lt;br /&gt;
&lt;br /&gt;
Dim X As Integer&lt;br /&gt;
&lt;br /&gt;
'Start&lt;br /&gt;
   X = Sum_n_loop(10)&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
' -----&lt;br /&gt;
&lt;br /&gt;
Function Sum_n_loop(byval N As Integer) As Integer&lt;br /&gt;
   Sum_n_loop = 0&lt;br /&gt;
   While N &amp;gt; 0&lt;br /&gt;
      Sum_n_loop = Sum_n_loop + N&lt;br /&gt;
      Decr N&lt;br /&gt;
   Wend&lt;br /&gt;
End Function&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
'''Compilat:'''&lt;br /&gt;
&lt;br /&gt;
{{Codevergleich|avr-gcc|BASCOM&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
00000000 &amp;lt;sum_n_loop&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
unsigned int &lt;br /&gt;
sum_n_loop (unsigned int n)&lt;br /&gt;
{&lt;br /&gt;
   unsigned int sum = 0;&lt;br /&gt;
   0:	ldi	r18, 0x00&lt;br /&gt;
   2:	ldi	r19, 0x00&lt;br /&gt;
   unsigned int i;&lt;br /&gt;
&lt;br /&gt;
   for (i=n; i &amp;gt; 0; i--)&lt;br /&gt;
   4:	sbiw	r24, 0x00&lt;br /&gt;
   6:	breq	.+8   ; 0x10&lt;br /&gt;
      sum += i;&lt;br /&gt;
   8:	add	r18, r24&lt;br /&gt;
   a:	adc	r19, r25&lt;br /&gt;
   c:	sbiw	r24, 0x01&lt;br /&gt;
   e:	rjmp	.-12  ; 0x4&lt;br /&gt;
	&lt;br /&gt;
   return sum;	&lt;br /&gt;
}&lt;br /&gt;
  10:	movw	r24, r18&lt;br /&gt;
  12:	ret&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
das Ganze aus Spass auch noch als Keil-ARM7 Code&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
*** CODE SEGMENT '?PR?sum_n_loop?A?main':&lt;br /&gt;
  283: unsigned int sum_n_loop (unsigned int n)&lt;br /&gt;
 00  MOV         R2,R0 ; n&lt;br /&gt;
  284: {&lt;br /&gt;
  285:    unsigned int sum = 0;&lt;br /&gt;
 04  MOV         R1,#0x0&lt;br /&gt;
  288:    for (i=n; i &amp;gt; 0; i--)&lt;br /&gt;
 08  MOV         R0,R2 ; n&lt;br /&gt;
 0C  B           L_11  ; Targ=0x1C&lt;br /&gt;
 10          L_12:&lt;br /&gt;
  289:       sum += i;&lt;br /&gt;
 10  MOV         R2,R0 ; i&lt;br /&gt;
 14  ADD         R1,R1,R2 ; sum&lt;br /&gt;
 18  SUB         R0,R0,#0x0001 ; i&lt;br /&gt;
 1C  L_11:&lt;br /&gt;
 1C  MOV         R2,R0 ; i&lt;br /&gt;
 20  CMP         R2,#0x0000 ; i&lt;br /&gt;
 24  BHI         L_12  ; Targ=0x10&lt;br /&gt;
  291:    return sum;  &lt;br /&gt;
 28  MOV         R0,R1 ; sum&lt;br /&gt;
  292: }&lt;br /&gt;
 2C  BX          R14&lt;br /&gt;
 30  ENDP ; 'sum_n_loop?A'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;---------------------------------------------------------&lt;br /&gt;
;   Function Sum_n_loop(byval N As Integer) As Integer&lt;br /&gt;
;---------------------------------------------------------&lt;br /&gt;
L_0x00B4:&lt;br /&gt;
&lt;br /&gt;
;---------------------------------------------------------&lt;br /&gt;
;   Sum_n_loop = 0&lt;br /&gt;
;---------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
	LDI	r24,0x00    ; clear&lt;br /&gt;
	LDI	r25,0x00    ; &lt;br /&gt;
	LDD	XL,Y + 2    ; return value addr (softstack)&lt;br /&gt;
	LDD	XH,Y + 3&lt;br /&gt;
	ST	X+,r24      ;  &lt;br /&gt;
	ST	X,r25&lt;br /&gt;
&lt;br /&gt;
L_0x00C0:&lt;br /&gt;
&lt;br /&gt;
;---------------------------------------------------------&lt;br /&gt;
;   While N &amp;gt; 0&lt;br /&gt;
;---------------------------------------------------------&lt;br /&gt;
	LDD	XL,Y + 0  ; argument addr (softstack)&lt;br /&gt;
	LDD	XH,Y + 1&lt;br /&gt;
	LD	r16,X+    ; load r16:r17&lt;br /&gt;
	LD	r17,X&lt;br /&gt;
	CPI	r16,0x00   ; LOW  &amp;lt;&amp;gt; 0 ?&lt;br /&gt;
	LDI	r21,0x00   &lt;br /&gt;
	CPC	r17,r21    ; HIGH &amp;lt;&amp;gt; 0 ? &lt;br /&gt;
	BRLT	L_0x00D6   ; branch lower  -&amp;gt;function exit&lt;br /&gt;
	BREQ	L_0x00D6   ; branch equal  -&amp;gt;function exit&lt;br /&gt;
	JMP	L_0x00DA   ; continue&lt;br /&gt;
L_0x00D6:&lt;br /&gt;
	JMP	L_0x0102   ; jmp function exit&lt;br /&gt;
&lt;br /&gt;
L_0x00DA:&lt;br /&gt;
;---------------------------------------------------------&lt;br /&gt;
;      Sum_n_loop = Sum_n_loop + N&lt;br /&gt;
;---------------------------------------------------------&lt;br /&gt;
	LDD	XL,Y + 2   ; summ_n_loop &lt;br /&gt;
	LDD	XH,Y + 3&lt;br /&gt;
	LD	r16,X+     ; into r16:r17&lt;br /&gt;
	LD	r17,X&lt;br /&gt;
	LDD	XL,Y + 0   ; N&lt;br /&gt;
	LDD	XH,Y + 1&lt;br /&gt;
	LD	r20,X+     ; into r20:r21&lt;br /&gt;
	LD	r21,X&lt;br /&gt;
	ADD	r16,r20    ; add      r16, r20&lt;br /&gt;
	ADC	r17,r21    ; add+cy   r17, r21&lt;br /&gt;
	LDD	XL,Y + 2   ; &lt;br /&gt;
	LDD	XH,Y + 3&lt;br /&gt;
	ST	X+,r16     ; store sum&lt;br /&gt;
	ST	X,r17&lt;br /&gt;
;---------------------------------------------------------&lt;br /&gt;
;      Decr N&lt;br /&gt;
;---------------------------------------------------------&lt;br /&gt;
	LDD	XL,Y + 0&lt;br /&gt;
	LDD	XH,Y + 1&lt;br /&gt;
	CALL	L_0x0114&lt;br /&gt;
;---------------------------------------------------------&lt;br /&gt;
;   Wend&lt;br /&gt;
;---------------------------------------------------------&lt;br /&gt;
	JMP	L_0x00C0 ; reenter loop&lt;br /&gt;
;---------------------------------------------------------&lt;br /&gt;
L_0x0102:&lt;br /&gt;
	RET      ; end function&lt;br /&gt;
;---------------------------------------------------------&lt;br /&gt;
; library function : decrement integer&lt;br /&gt;
;---------------------------------------------------------&lt;br /&gt;
L_0x0114:&lt;br /&gt;
	LD	ZL,X+&lt;br /&gt;
	LD	ZH,X&lt;br /&gt;
	SBIW	ZL,0x0001&lt;br /&gt;
	ST	X,ZH&lt;br /&gt;
	ST	-X,ZL&lt;br /&gt;
	RET&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Remark''': Das reine Register-rechnen (GCC) macht Bascom nicht. Er arbeitet immer im SRAM , brav mit Load &amp;amp; Store. (PicNick)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Berechnung mit rekursiver Funktion ==&lt;br /&gt;
&lt;br /&gt;
'''Quellcodes:'''&lt;br /&gt;
&lt;br /&gt;
{{Codevergleich|avr-gcc|BASCOM&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
unsigned int &lt;br /&gt;
sum_n_rekursiv (unsigned int n)&lt;br /&gt;
{&lt;br /&gt;
   if (n == 0)&lt;br /&gt;
      return 0;&lt;br /&gt;
&lt;br /&gt;
   return n + sum_n_rekursiv (n-1);	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
???&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
'''Compilat:'''&lt;br /&gt;
&lt;br /&gt;
{{Codevergleich|avr-gcc|BASCOM&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
00000000 &amp;lt;sum_n_rekursiv&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
unsigned int &lt;br /&gt;
sum_n_rekursiv (unsigned int n)&lt;br /&gt;
{&lt;br /&gt;
   0:	push	r28&lt;br /&gt;
   2:	push	r29&lt;br /&gt;
   4:	movw	r28, r24&lt;br /&gt;
   if (n == 0)&lt;br /&gt;
   6:	sbiw	r24, 0x00&lt;br /&gt;
   8:	breq	.+8     ; 0x12&lt;br /&gt;
      return 0;&lt;br /&gt;
&lt;br /&gt;
   return n + sum_n_rekursiv (n-1);	&lt;br /&gt;
   a:	sbiw	r24, 0x01&lt;br /&gt;
   c:	rcall	.-14    ; 0x0&lt;br /&gt;
   e:	add	r24, r28&lt;br /&gt;
  10:	adc	r25, r29&lt;br /&gt;
}  &lt;br /&gt;
  12:	pop	r29&lt;br /&gt;
  14:	pop	r28&lt;br /&gt;
  16:	ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
daraus macht der Keil-ARM7 folgendes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
*** CODE SEGMENT '?PR?sum_n_rekursiv?A?main':&lt;br /&gt;
  283: unsigned int sum_n_rekursiv (unsigned int n)&lt;br /&gt;
 00  STMDB       R13!,{R4,LR}&lt;br /&gt;
 04  MOV         R4,R0 ; n&lt;br /&gt;
  285:    if (n == 0)&lt;br /&gt;
 08  MOV         R0,R4 ; n&lt;br /&gt;
 0C  CMP         R0,#0x0000 ; n&lt;br /&gt;
 10  BNE         L_9  ; Targ=0x1C&lt;br /&gt;
  286:       return 0;&lt;br /&gt;
 14  MOV         R0,#0x0&lt;br /&gt;
 18  B           L_10  ; Targ=0x30&lt;br /&gt;
 1C          L_9:&lt;br /&gt;
  288:    return n + sum_n_rekursiv (n-1); &lt;br /&gt;
 1C  MOV         R0,R4 ; n&lt;br /&gt;
 20  SUB         R0,R0,#0x0001 ; n&lt;br /&gt;
 24  BL          sum_n_rekursiv?A  ; Targ=0x0&lt;br /&gt;
 28  MOV         R1,R4 ; n&lt;br /&gt;
 2C  ADD         R0,R1,R0 ; n&lt;br /&gt;
  289: }&lt;br /&gt;
 30          L_10:&lt;br /&gt;
 30  LDMIA       R13!,{R4}&lt;br /&gt;
 34  LDMIA       R13!,{R3}&lt;br /&gt;
 38  BX          R3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
???&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Berechnung durch Formel ==&lt;br /&gt;
&lt;br /&gt;
'''Quellcodes:'''&lt;br /&gt;
{{Codevergleich|avr-gcc|BASCOM&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
unsigned int &lt;br /&gt;
sum_n_formel (unsigned int n)&lt;br /&gt;
{&lt;br /&gt;
   return n*(n+1) / 2;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Bascom mag keine Formeln. Diese müssen erst zerlegt werden. &lt;br /&gt;
Ob diese Art der Berechnug schlechter ist kann so nicht gesagt&lt;br /&gt;
werden. Auf jedem Fall ist diese Methode nicht elegant und&lt;br /&gt;
ziemlich unübersichtlich, da der Zusammenhang verloren geht.&lt;br /&gt;
&lt;br /&gt;
Declare Function Sum_n_formel(byval I As Integer) As Integer&lt;br /&gt;
&lt;br /&gt;
Dim X As Integer&lt;br /&gt;
&lt;br /&gt;
'Start&lt;br /&gt;
&lt;br /&gt;
   X = Sum_n_loop(10)&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
' -----&lt;br /&gt;
&lt;br /&gt;
Function Sum_n_formel(byval I As Integer)&lt;br /&gt;
&lt;br /&gt;
   X = I + 1&lt;br /&gt;
   X = X * I&lt;br /&gt;
&lt;br /&gt;
   Sum_n_loop = X / 2&lt;br /&gt;
&lt;br /&gt;
End Function&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Codevergleich|avr-gcc|BASCOM&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
00000000 &amp;lt;sum_n_formel&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
unsigned int &lt;br /&gt;
sum_n_formel (unsigned int n)&lt;br /&gt;
{&lt;br /&gt;
   return n*(n+1) / 2;&lt;br /&gt;
   0:	mul	r24, r24&lt;br /&gt;
   2:	movw	r18, r0&lt;br /&gt;
   4:	mul	r24, r25&lt;br /&gt;
   6:	add	r19, r0&lt;br /&gt;
   8:	mul	r25, r24&lt;br /&gt;
   a:	add	r19, r0&lt;br /&gt;
   c:	eor	r1, r1&lt;br /&gt;
   e:	add	r18, r24&lt;br /&gt;
  10:	adc	r19, r25&lt;br /&gt;
}&lt;br /&gt;
  12:	movw	r24, r18&lt;br /&gt;
  14:	lsr	r25&lt;br /&gt;
  16:	ror	r24&lt;br /&gt;
  18:	ret&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Es geht auch mit deutlich weniger Registern im ARM7&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
*** CODE SEGMENT '?PR?sum_n_formel?A?main':&lt;br /&gt;
  284: sum_n_formel (unsigned int n)&lt;br /&gt;
 00  MOV         R2,R0 ; n&lt;br /&gt;
  286:    return n*(n+1) / 2;&lt;br /&gt;
 04  MOV         R1,R2 ; n&lt;br /&gt;
 08  ADD         R1,R1,#0x0001 ; n&lt;br /&gt;
 0C  MOV         R0,R2 ; n&lt;br /&gt;
 10  MUL         R0,R1,R0&lt;br /&gt;
 14  MOV         R0,R0,LSR #1&lt;br /&gt;
  287: }&lt;br /&gt;
 18  BX          R14&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
???&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Interrupt-Routinen=&lt;br /&gt;
Auch diese Beispiele machen nicht viel. Das erste zählt nur eine 16-Bit Variable hoch, das zweite macht nichts weiter, als ein Funktionsaufruf.&lt;br /&gt;
&lt;br /&gt;
==Eine Variable hochzählen==&lt;br /&gt;
&lt;br /&gt;
'''Quellcodes:'''&lt;br /&gt;
&lt;br /&gt;
{{Codevergleich|avr-gcc|BASCOM&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/signal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int volatile count;&lt;br /&gt;
&lt;br /&gt;
SIGNAL (SIG_OVERFLOW0)&lt;br /&gt;
{&lt;br /&gt;
   count++;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
'''Compilat:'''&lt;br /&gt;
&lt;br /&gt;
{{Codevergleich|avr-gcc|BASCOM&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
__vector_9:&lt;br /&gt;
   push __zero_reg__&lt;br /&gt;
   push __tmp_reg__&lt;br /&gt;
   in __tmp_reg__,__SREG__&lt;br /&gt;
   push __tmp_reg__&lt;br /&gt;
   clr __zero_reg__&lt;br /&gt;
   push r24&lt;br /&gt;
   push r25&lt;br /&gt;
&lt;br /&gt;
   lds r24,count&lt;br /&gt;
   lds r25,(count)+1&lt;br /&gt;
   adiw r24,1&lt;br /&gt;
   sts (count)+1,r25&lt;br /&gt;
   sts count,r24&lt;br /&gt;
&lt;br /&gt;
   pop r25&lt;br /&gt;
   pop r24&lt;br /&gt;
   pop __tmp_reg__&lt;br /&gt;
   out __SREG__,__tmp_reg__&lt;br /&gt;
   pop __tmp_reg__&lt;br /&gt;
   pop __zero_reg__&lt;br /&gt;
   reti&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Variable holen, addieren, wegschreiben.. den Rest macht der ARM7 selbst. Viel interessanter ist, das der ARM den Counter in ein Register kriegt, der AVR aber über 2 Register rechnen muss (r24 und r25). Dafür muss aber der Arm 2 LDR ausführen um an die Countervariable zu kommen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
*** CODE SEGMENT '?PR?ISR?A?main':&lt;br /&gt;
  288:     count++;&lt;br /&gt;
 00  LDR         R0,=count ; count&lt;br /&gt;
 04  LDR         R1,[R0,#0x0] ; count&lt;br /&gt;
 08  ADD         R1,R1,#0x0001&lt;br /&gt;
 0C  STR         R1,[R0,#0x0] ; count&lt;br /&gt;
 10  BX          R14&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Der Code ist auf Grund der Architektur nicht direkt vergleichbar mit dem AVR. Der Arm 7 besitzt einen eigenen Interrupt Stack, Befehle um ganze Registersätze zu popen/puschen, einen Vectorinterruptcontroller und User/Supervisor Prioritätsebenen, ähnlich der einer x86 CPU. Das wäre als wolle man avr-gcc und Bascom vergleichen :)&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Eine Funktion aufrufen==&lt;br /&gt;
&lt;br /&gt;
'''Quellcodes:'''&lt;br /&gt;
{{Codevergleich|avr-gcc|BASCOM&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/signal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
extern void foo();&lt;br /&gt;
&lt;br /&gt;
SIGNAL (SIG_OVERFLOW1)&lt;br /&gt;
{&lt;br /&gt;
   foo();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Compilat:'''&lt;br /&gt;
&lt;br /&gt;
{{Codevergleich|avr-gcc|BASCOM&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
__vector_8:&lt;br /&gt;
   push __zero_reg__&lt;br /&gt;
   push __tmp_reg__&lt;br /&gt;
   in __tmp_reg__,__SREG__&lt;br /&gt;
   push __tmp_reg__&lt;br /&gt;
   clr __zero_reg__&lt;br /&gt;
   push r18&lt;br /&gt;
   push r19&lt;br /&gt;
   push r20&lt;br /&gt;
   push r21&lt;br /&gt;
   push r22&lt;br /&gt;
   push r23&lt;br /&gt;
   push r24&lt;br /&gt;
   push r25&lt;br /&gt;
   push r26&lt;br /&gt;
   push r27&lt;br /&gt;
   push r30&lt;br /&gt;
   push r31&lt;br /&gt;
&lt;br /&gt;
   rcall foo&lt;br /&gt;
&lt;br /&gt;
   pop r31&lt;br /&gt;
   pop r30&lt;br /&gt;
   pop r27&lt;br /&gt;
   pop r26&lt;br /&gt;
   pop r25&lt;br /&gt;
   pop r24&lt;br /&gt;
   pop r23&lt;br /&gt;
   pop r22&lt;br /&gt;
   pop r21&lt;br /&gt;
   pop r20&lt;br /&gt;
   pop r19&lt;br /&gt;
   pop r18&lt;br /&gt;
   pop __tmp_reg__&lt;br /&gt;
   out __SREG__,__tmp_reg__&lt;br /&gt;
   pop __tmp_reg__&lt;br /&gt;
   pop __zero_reg__&lt;br /&gt;
   reti&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Und hier der Arm 7 Code.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
*** CODE SEGMENT '?PR?ISR?A?main':&lt;br /&gt;
  285: void ISR( void )&lt;br /&gt;
 00  STMDB       R13!,{LR}&lt;br /&gt;
  287:     foo();&lt;br /&gt;
 04  BL          foo?A  ; Targ=0x0&lt;br /&gt;
 08  LDMIA       R13!,{R3}&lt;br /&gt;
 0C  BX          R3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Der Code ist auf Grund der Architektur nicht direkt vergleichbar mit dem AVR.&lt;br /&gt;
Der Arm 7 besitzt einen eigenen Interrupt Stack, Befehle um ganze Registersätze zu popen/puschen, einen Vectorinterruptcontroller und User/Supervisor Prioritätsebenen, ähnlich der einer x86 CPU.&lt;br /&gt;
Das wäre als wolle man avr-gcc und Bascom vergleichen :)&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Sortieren mit Bubble-Sort =&lt;br /&gt;
&lt;br /&gt;
Zum Abschluss noch ein komplexeres Beispiel: Ein Array mit 8-Bit-Werten soll mit Bubble-Sort der Größe nach sortiert werden. &lt;br /&gt;
&lt;br /&gt;
Im Array wird nach dem größten Wert gesucht und dieser ans Ende getauscht. Danach macht man den Teilbereich, in dem man das Maximum sucht, um 1 kleiner, bis man fertig ist. Die größten Zahlen wandern wie Blasen nach oben, daher der Name ''Bubble-Sort'' für diesen Sortier-Algorithmus.&lt;br /&gt;
&lt;br /&gt;
'''Variablen:'''&lt;br /&gt;
* &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt; Array-Größe&lt;br /&gt;
* &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; das Array&lt;br /&gt;
* &amp;lt;tt&amp;gt;i&amp;lt;/tt&amp;gt; Größe der Teilbereichs&lt;br /&gt;
* &amp;lt;tt&amp;gt;j&amp;lt;/tt&amp;gt; Laufvariable durch den Teilbereich&lt;br /&gt;
&lt;br /&gt;
'''Quellcodes:'''&lt;br /&gt;
&lt;br /&gt;
{{Codevergleich|avr-gcc|BASCOM&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;limits.h&amp;gt;&lt;br /&gt;
#include &amp;lt;inttypes.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void &lt;br /&gt;
bubble_sort (uint8_t n, char * a)&lt;br /&gt;
{&lt;br /&gt;
   uint8_t i;&lt;br /&gt;
&lt;br /&gt;
   // Bereich schrumpft von n auf 2&lt;br /&gt;
   for (i = n; i &amp;gt;= 2; i--)&lt;br /&gt;
   {&lt;br /&gt;
      char max = CHAR_MIN;&lt;br /&gt;
      uint8_t j, j_max;&lt;br /&gt;
&lt;br /&gt;
      // im Bereich nach MAX suchen&lt;br /&gt;
      for (j = 0; j &amp;lt; i; j++)&lt;br /&gt;
      {&lt;br /&gt;
         if (a[j] &amp;gt;= max)&lt;br /&gt;
         {&lt;br /&gt;
            // MAX und Pos. merken&lt;br /&gt;
            j_max = j;&lt;br /&gt;
            max   = a[j_max];&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // MAX ans Ende tauschen&lt;br /&gt;
      a[j_max] = a[i-1];&lt;br /&gt;
      a[i-1]   = max;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
'''Compilat:'''&lt;br /&gt;
&lt;br /&gt;
{{Codevergleich|avr-gcc|BASCOM&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
00000000 &amp;lt;bubble_sort&amp;gt;:&lt;br /&gt;
{&lt;br /&gt;
   uint8_t i;&lt;br /&gt;
&lt;br /&gt;
   // Bereich schrumpft von n auf 2&lt;br /&gt;
   for (i = n; i &amp;gt;= 2; i--)&lt;br /&gt;
   0:	cpi	r24, 0x02&lt;br /&gt;
   2:	brcs	.+54     ; 0x3a&lt;br /&gt;
   4:	movw	r26, r22&lt;br /&gt;
   6:	add	r26, r24&lt;br /&gt;
   8:	adc	r27, r1&lt;br /&gt;
   a:	sbiw	r26, 0x01&lt;br /&gt;
   {&lt;br /&gt;
      char max = CHAR_MIN;&lt;br /&gt;
   c:	ldi	r20, 0x80&lt;br /&gt;
      uint8_t j, j_max;&lt;br /&gt;
&lt;br /&gt;
      // im Bereich nach MAX suchen&lt;br /&gt;
      for (j = 0; j &amp;lt; i; j++)&lt;br /&gt;
   e:	ldi	r19, 0x00&lt;br /&gt;
  10:	cp	r19, r24&lt;br /&gt;
  12:	brcc	.+18     ; 0x26&lt;br /&gt;
  14:	movw	r30, r22&lt;br /&gt;
      {&lt;br /&gt;
         if (a[j] &amp;gt;= max)&lt;br /&gt;
  16:	ld	r18, Z+&lt;br /&gt;
  18:	cp	r18, r20&lt;br /&gt;
  1a:	brlt	.+4      ; 0x20&lt;br /&gt;
         {&lt;br /&gt;
            // MAX und Pos. merken&lt;br /&gt;
            j_max = j;&lt;br /&gt;
  1c:	mov	r21, r19&lt;br /&gt;
            max   = a[j_max];&lt;br /&gt;
  1e:	mov	r20, r18&lt;br /&gt;
  20:	subi	r19, 0xFF&lt;br /&gt;
  22:	cp	r19, r24&lt;br /&gt;
  24:	brcs	.-16     ; 0x16&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // MAX ans Ende tauschen&lt;br /&gt;
      a[j_max] = a[i-1];&lt;br /&gt;
  26:	movw	r30, r22&lt;br /&gt;
  28:	add	r30, r21&lt;br /&gt;
  2a:	adc	r31, r1&lt;br /&gt;
  2c:	ld	r18, X&lt;br /&gt;
  2e:	st	Z, r18&lt;br /&gt;
      a[i-1]   = max;&lt;br /&gt;
  30:	st	X, r20&lt;br /&gt;
  32:	subi	r24, 0x01&lt;br /&gt;
  34:	sbiw	r26, 0x01&lt;br /&gt;
  36:	cpi	r24, 0x02&lt;br /&gt;
  38:	brcc	.-46     ; 0xc&lt;br /&gt;
  3a:	ret&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Und hier das Ganze noch mal als ARM7 Code&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
*** CODE SEGMENT '?PR?bubble_sort?A?main':&lt;br /&gt;
  285: void bubble_sort (uint8_t n, char * a)&lt;br /&gt;
 00  STMDB       R13!,{R4-R6}&lt;br /&gt;
 04  MOV         R3,R0 ; n&lt;br /&gt;
  286: {&lt;br /&gt;
  290:    for (i = n; i &amp;gt;= 2; i--)&lt;br /&gt;
 08  MOV         R0,R3 ; n&lt;br /&gt;
 0C  B           L_11  ; Targ=0xD4&lt;br /&gt;
 10          L_12:&lt;br /&gt;
  291:    {&lt;br /&gt;
  292:       char max = CHAR_MIN;&lt;br /&gt;
 10  MOV         R3,#0x0&lt;br /&gt;
 14  MOV         R6,R3 ; max&lt;br /&gt;
  296:       for (j = 0; j &amp;lt; i; j++)&lt;br /&gt;
 18  B           L_16  ; Targ=0x64&lt;br /&gt;
 1C          L_17:&lt;br /&gt;
  298:          if (a[j] &amp;gt;= max)&lt;br /&gt;
 1C  MOV         R4,R3 ; j&lt;br /&gt;
 20  MOV         R5,R4,LSL #24 ; j&lt;br /&gt;
 24  MOV         R5,R5,LSR #24&lt;br /&gt;
 28  MOV         R4,R1 ; a&lt;br /&gt;
 2C  LDRB        R4,[R4,+R5]&lt;br /&gt;
 30  MOV         R5,R6 ; max&lt;br /&gt;
 34  MOV         R5,R5,LSL #24 ; max&lt;br /&gt;
 38  MOV         R5,R5,LSR #24&lt;br /&gt;
 3C  CMP         R4,R5&lt;br /&gt;
 40  BCC         L_14  ; Targ=0x5C&lt;br /&gt;
  301:             j_max = j;&lt;br /&gt;
 44  MOV         R2,R3 ; j&lt;br /&gt;
  302:             max   = a[j_max];&lt;br /&gt;
 48  MOV         R4,R2 ; j_max&lt;br /&gt;
 4C  MOV         R5,R4,LSL #24 ; j_max&lt;br /&gt;
 50  MOV         R5,R5,LSR #24&lt;br /&gt;
 54  MOV         R4,R1 ; a&lt;br /&gt;
 58  LDRB        R6,[R4,+R5]&lt;br /&gt;
  304:       }&lt;br /&gt;
 5C          L_14:&lt;br /&gt;
 5C  ADD         R3,R3,#0x0001 ; j&lt;br /&gt;
 60  AND         R3,R3,#0x00FF&lt;br /&gt;
 64          L_16:&lt;br /&gt;
 64  MOV         R4,R0 ; i&lt;br /&gt;
 68  MOV         R5,R4,LSL #24 ; i&lt;br /&gt;
 6C  MOV         R5,R5,LSR #24&lt;br /&gt;
 70  MOVR        R4,R3 ; j&lt;br /&gt;
 74  MOV         R4,R4,LSL #24 ; j&lt;br /&gt;
 78  MOV         R4,R4,LSR #24&lt;br /&gt;
 7C  CMP         R4,R5&lt;br /&gt;
 80  BCC         L_17  ; Targ=0x1C&lt;br /&gt;
  307:       a[j_max] = a[i-1];&lt;br /&gt;
 84  MOV         R3,R0 ; i&lt;br /&gt;
 88  MOV         R4,R3,LSL #24 ; i&lt;br /&gt;
 8C  MOV         R4,R4,LSR #24&lt;br /&gt;
 90  MOV         R3,R1 ; a&lt;br /&gt;
 94  ADD         R3,R3,R4 ; a&lt;br /&gt;
 98  LDRB        R3,[R3,#0xFFFFFFFF]&lt;br /&gt;
 9C  MOV         R4,R2 ; j_max&lt;br /&gt;
 A0  MOV         R5,R4,LSL #24 ; j_max&lt;br /&gt;
 A4  MOV         R5,R5,LSR #24&lt;br /&gt;
 A8  MOV         R4,R1 ; a&lt;br /&gt;
 AC  STRB        R3,[R4,+R5]&lt;br /&gt;
  308:       a[i-1]   = max;&lt;br /&gt;
 B0  MOV         R3,R6 ; max&lt;br /&gt;
 B4  MOV         R4,R0 ; i&lt;br /&gt;
 B8  MOV         R5,R4,LSL #24 ; i&lt;br /&gt;
 BC  MOV         R5,R5,LSR #24&lt;br /&gt;
 C0  MOV         R4,R1 ; a&lt;br /&gt;
 C4  ADD         R4,R4,R5 ; a&lt;br /&gt;
 C8  STRB        R3,[R4,#0xFFFFFFFF]&lt;br /&gt;
  309:    }&lt;br /&gt;
 CC  SUB         R0,R0,#0x0001 ; i&lt;br /&gt;
 D0  AND         R0,R0,#0x00FF&lt;br /&gt;
 D4          L_11:&lt;br /&gt;
 D4  MOV         R3,R0 ; i&lt;br /&gt;
 D8  MOV         R3,R3,LSL #24 ; i&lt;br /&gt;
 DC  MOV         R3,R3,LSR #24&lt;br /&gt;
 E0  CMP         R3,#0x0002&lt;br /&gt;
 E4  BGE         L_12  ; Targ=0x10&lt;br /&gt;
  310: }&lt;br /&gt;
 E8  LDMIA       R13!,{R4-R6}&lt;br /&gt;
 EC  BX          R14&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Die Codes wurden etwas nachkommentiert und -formatiert, um besser den Zusammenhang mit der Quelle durchblicken zu können.&lt;br /&gt;
&lt;br /&gt;
= Zusammenfassung =&lt;br /&gt;
&lt;br /&gt;
Für diese drei Summier-Routinen erhält man folgende Ergebnisse für Laufzeit und Platzverbrauch. Die Laufzeittest wurden gemacht für N=20, d.h. es wurden die ersten 20 ganzen Zahlen aufsummiert.&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! Verbrauch an Flash (in Bytes) || avr-gcc || BASCOM&lt;br /&gt;
|- &lt;br /&gt;
 |&amp;lt;tt&amp;gt;sum_n_loop&amp;lt;/tt&amp;gt; || 20 || ???&lt;br /&gt;
|- &lt;br /&gt;
 |&amp;lt;tt&amp;gt;sum_n_rekursiv&amp;lt;/tt&amp;gt; || 24 || ???&lt;br /&gt;
|- &lt;br /&gt;
 |&amp;lt;tt&amp;gt;sum_n_formel&amp;lt;/tt&amp;gt; || 26 || ???&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! Verbrauch an Zeit (in CPU-Zyklen) || avr-gcc || BASCOM&lt;br /&gt;
|-&lt;br /&gt;
 |&amp;lt;tt&amp;gt;sum_n_loop (20)&amp;lt;/tt&amp;gt; || 191 || ???&lt;br /&gt;
|- &lt;br /&gt;
 |&amp;lt;tt&amp;gt;sum_n_rekursiv (20)&amp;lt;/tt&amp;gt; || 477 || ???&lt;br /&gt;
|- &lt;br /&gt;
 |&amp;lt;tt&amp;gt;sum_n_formel (20)&amp;lt;/tt&amp;gt; || 19 || ???&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
* [[Sourcevergleich]]&lt;br /&gt;
* [[avr-gcc]]&lt;br /&gt;
* [[Bascom]]&lt;br /&gt;
* [[AVR]]&lt;br /&gt;
* [[ARM]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Quellcode Bascom]]&lt;br /&gt;
[[Kategorie:Quellcode C]]&lt;br /&gt;
[[Kategorie:Quellcode Assembler AVR]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:Praxis]]&lt;/div&gt;</summary>
		<author><name>MrByte</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Codevergleich_AVR-Compiler&amp;diff=14553</id>
		<title>Codevergleich AVR-Compiler</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Codevergleich_AVR-Compiler&amp;diff=14553"/>
				<updated>2009-02-09T19:42:26Z</updated>
		
		<summary type="html">&lt;p&gt;MrByte: /* Berechnung durch Formel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein wichtiges Merkmal eines [[Compiler]]s ist die Güte des erzeugten Codes.&lt;br /&gt;
Immerhin will man seine Hardware optimal nutzen, und die geschriebenen Programme sollen möglichst wenig Laufzeit brauchen und möglichst wenig Speicher &amp;amp;ndash; also RAM und [[Flash]] &amp;amp;ndash; belegen.&lt;br /&gt;
&lt;br /&gt;
{{Ausbauwunsch|Bascom Beispiele}}&lt;br /&gt;
&lt;br /&gt;
Ein Vergleich der erzeugten Codes ist jedoch nicht einfach, denn ein Problem kann bereits innerhalb ein und der selben Programmiersprache auf sehr unterschiedliche Art und Weisen formuliert oder gelöst werden.&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel versucht ansatzweise einen Codevergleich weit verbreiteter [[AVR]]-Compiler anhand sehr einfacher Aufgaben, die &amp;quot;geradeaus&amp;quot; und ohne Umschweife programmiert wurden. &lt;br /&gt;
&lt;br /&gt;
Ein Vergleich der Programmierung von Hardware-Komponenten und Peripherie wie [[Timer]]-, [[UART]]- oder [[I2C]]-Module scheint dabei weniger interessant, denn obwohl die Codes zum Steuern dieser Komponente in unterschiedlichen Sprachen recht verschieden aussehen, werden sie doch auf die selben Maschinen-Codes abgebildet, die sich im wesentlichen auf das Setzen und Lesen von Registern (SFRs) reduzieren. &lt;br /&gt;
&lt;br /&gt;
Neben diesen für jedes Programm essenziellen Abschnitten besteht ein Programm aber zum großen Teil aus hardwareunabhängigen Aufgaben wie Registerverwaltung, Funktionsaufrufen, Schleifen, Abfragen, Zuweisungen, Parameterübergaben, Abfragen von Bedingungen, Arithmetik, Implementierung von [[Interrupt Service Routine]]n, etc.&lt;br /&gt;
&lt;br /&gt;
Interessanter erscheint ein Vergleich einfacher Aufgaben, die erkennen lassen, wie gut ein Compiler in der Lage ist, die Ressourcen eines [[Mikrocontroller]]s zu nutzen bzw. zu schonen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Rahmenbedingungen =&lt;br /&gt;
&lt;br /&gt;
;[[avr-gcc]]: Die Assembler-Ausgaben wurden mit der Optimierungsstufe &amp;quot;auf Größe optimieren&amp;quot; (&amp;lt;tt&amp;gt;-Os&amp;lt;/tt&amp;gt;) für einen [[ATmega8]] erstellt. [[GCC]]-Version war 3.4.x. Andere Optimierungsstufen haben wenig bis keinen Einfluss auf den erzeugtenCode. Codes für andere Controller der ATmega-Familie unterscheiden sich praktisch nicht vom ATmega8-Code.&lt;br /&gt;
&lt;br /&gt;
:Die acr-gcc Assembler-Dumps wurden erzeugt mit&lt;br /&gt;
:{|&lt;br /&gt;
|-&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; avr-gcc -mmcu=atmega8 -g -Os datei.c -c -o datei.o&lt;br /&gt;
&amp;gt; avr-objdump -d -S datei.o&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
(Zu beachten ist, daß &amp;lt;tt&amp;gt;datei.o&amp;lt;/tt&amp;gt; ein noch nicht loktiertes Objekt ist und daher Adressen noch mit Platzhaltern (üblicherweise 0) gefüllt sind und daher im Dump noch als 0 angezeigt werden.)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;[[Bascom]]: Das einzige Assembler-Code-Listing von Bascom (Aufsummieren in einer Schleife) wurde von PicNick mit einem selbstgestrickten *.HEX File Analyzer erstellt, da der Disassembler von AVR-Studio etwas schwer lesbar ist.&lt;br /&gt;
&lt;br /&gt;
;[[Keil-ARM7]]: Es wurden einige weitere Codezeilen für ein RISC ARM7 System (LPC2138) mit Keil Compiler jeweils unter die gcc-avr Varianten gestellt um auch hier einen Vergleich außerhalb der Konkurrenz gcc-avr/Bascom ziehen zu können. Die Optimierung lag auf 'speed' und Registeroptimierung. Man sieht gewisse Ähnlichkeiten zwischen gcc-avr und Keil-Arm7, im Detail sind die Aufgaben jedoch unterschiedlich gelöst. Auf Grund von deutlichen Unterschieden z.B. im Interrupt Handling sind die Codebeispiele teilweise nicht 1:1 vergleichbar. Die Codebeispiele sind ebenfalls noch nicht loktierte / gelinkte Objekte. Siehe oben.&lt;br /&gt;
&lt;br /&gt;
= Summe der ersten ''n'' Zahlen =&lt;br /&gt;
&lt;br /&gt;
Berechnet wird die Summe der ersten ''n'' Zahlen:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\operatorname{sum}(n) \,=\, \sum_{k=1}^n k &lt;br /&gt;
     \,=\, 1 + 2 + \ldots + n&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Zahl ''n'' wird als 16-Bit Zahl angegeben und das Ergebnis als 16-Bit-Zahl berechnet. Ein eventueller Überlauf wird nicht beachtet.&lt;br /&gt;
&lt;br /&gt;
Der Code wird jeweils als eigene Funktion implementiert, um Abhängigkeiten vom umliegenden Code zu vermeiden.&lt;br /&gt;
&lt;br /&gt;
Für diese Berechnung gibt es mehrere Möglichkeiten.&lt;br /&gt;
&lt;br /&gt;
== Aufsummieren in einer Schleife ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{Codevergleich|avr-gcc|BASCOM&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Quellcodes:'''&lt;br /&gt;
&lt;br /&gt;
{{Codevergleich|avr-gcc|BASCOM&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
unsigned int &lt;br /&gt;
sum_n_loop (unsigned int n)&lt;br /&gt;
{&lt;br /&gt;
   unsigned int sum = 0;&lt;br /&gt;
   unsigned int i;&lt;br /&gt;
&lt;br /&gt;
   for (i=n; i &amp;gt; 0; i--)&lt;br /&gt;
      sum += i;&lt;br /&gt;
	&lt;br /&gt;
   return sum;	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Declare Function Sum_n_loop(byval N As Integer) As Integer&lt;br /&gt;
&lt;br /&gt;
Dim X As Integer&lt;br /&gt;
&lt;br /&gt;
'Start&lt;br /&gt;
   X = Sum_n_loop(10)&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
' -----&lt;br /&gt;
&lt;br /&gt;
Function Sum_n_loop(byval N As Integer) As Integer&lt;br /&gt;
   Sum_n_loop = 0&lt;br /&gt;
   While N &amp;gt; 0&lt;br /&gt;
      Sum_n_loop = Sum_n_loop + N&lt;br /&gt;
      Decr N&lt;br /&gt;
   Wend&lt;br /&gt;
End Function&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
'''Compilat:'''&lt;br /&gt;
&lt;br /&gt;
{{Codevergleich|avr-gcc|BASCOM&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
00000000 &amp;lt;sum_n_loop&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
unsigned int &lt;br /&gt;
sum_n_loop (unsigned int n)&lt;br /&gt;
{&lt;br /&gt;
   unsigned int sum = 0;&lt;br /&gt;
   0:	ldi	r18, 0x00&lt;br /&gt;
   2:	ldi	r19, 0x00&lt;br /&gt;
   unsigned int i;&lt;br /&gt;
&lt;br /&gt;
   for (i=n; i &amp;gt; 0; i--)&lt;br /&gt;
   4:	sbiw	r24, 0x00&lt;br /&gt;
   6:	breq	.+8   ; 0x10&lt;br /&gt;
      sum += i;&lt;br /&gt;
   8:	add	r18, r24&lt;br /&gt;
   a:	adc	r19, r25&lt;br /&gt;
   c:	sbiw	r24, 0x01&lt;br /&gt;
   e:	rjmp	.-12  ; 0x4&lt;br /&gt;
	&lt;br /&gt;
   return sum;	&lt;br /&gt;
}&lt;br /&gt;
  10:	movw	r24, r18&lt;br /&gt;
  12:	ret&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
das Ganze aus Spass auch noch als Keil-ARM7 Code&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
*** CODE SEGMENT '?PR?sum_n_loop?A?main':&lt;br /&gt;
  283: unsigned int sum_n_loop (unsigned int n)&lt;br /&gt;
 00  MOV         R2,R0 ; n&lt;br /&gt;
  284: {&lt;br /&gt;
  285:    unsigned int sum = 0;&lt;br /&gt;
 04  MOV         R1,#0x0&lt;br /&gt;
  288:    for (i=n; i &amp;gt; 0; i--)&lt;br /&gt;
 08  MOV         R0,R2 ; n&lt;br /&gt;
 0C  B           L_11  ; Targ=0x1C&lt;br /&gt;
 10          L_12:&lt;br /&gt;
  289:       sum += i;&lt;br /&gt;
 10  MOV         R2,R0 ; i&lt;br /&gt;
 14  ADD         R1,R1,R2 ; sum&lt;br /&gt;
 18  SUB         R0,R0,#0x0001 ; i&lt;br /&gt;
 1C  L_11:&lt;br /&gt;
 1C  MOV         R2,R0 ; i&lt;br /&gt;
 20  CMP         R2,#0x0000 ; i&lt;br /&gt;
 24  BHI         L_12  ; Targ=0x10&lt;br /&gt;
  291:    return sum;  &lt;br /&gt;
 28  MOV         R0,R1 ; sum&lt;br /&gt;
  292: }&lt;br /&gt;
 2C  BX          R14&lt;br /&gt;
 30  ENDP ; 'sum_n_loop?A'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;---------------------------------------------------------&lt;br /&gt;
;   Function Sum_n_loop(byval N As Integer) As Integer&lt;br /&gt;
;---------------------------------------------------------&lt;br /&gt;
L_0x00B4:&lt;br /&gt;
&lt;br /&gt;
;---------------------------------------------------------&lt;br /&gt;
;   Sum_n_loop = 0&lt;br /&gt;
;---------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
	LDI	r24,0x00    ; clear&lt;br /&gt;
	LDI	r25,0x00    ; &lt;br /&gt;
	LDD	XL,Y + 2    ; return value addr (softstack)&lt;br /&gt;
	LDD	XH,Y + 3&lt;br /&gt;
	ST	X+,r24      ;  &lt;br /&gt;
	ST	X,r25&lt;br /&gt;
&lt;br /&gt;
L_0x00C0:&lt;br /&gt;
&lt;br /&gt;
;---------------------------------------------------------&lt;br /&gt;
;   While N &amp;gt; 0&lt;br /&gt;
;---------------------------------------------------------&lt;br /&gt;
	LDD	XL,Y + 0  ; argument addr (softstack)&lt;br /&gt;
	LDD	XH,Y + 1&lt;br /&gt;
	LD	r16,X+    ; load r16:r17&lt;br /&gt;
	LD	r17,X&lt;br /&gt;
	CPI	r16,0x00   ; LOW  &amp;lt;&amp;gt; 0 ?&lt;br /&gt;
	LDI	r21,0x00   &lt;br /&gt;
	CPC	r17,r21    ; HIGH &amp;lt;&amp;gt; 0 ? &lt;br /&gt;
	BRLT	L_0x00D6   ; branch lower  -&amp;gt;function exit&lt;br /&gt;
	BREQ	L_0x00D6   ; branch equal  -&amp;gt;function exit&lt;br /&gt;
	JMP	L_0x00DA   ; continue&lt;br /&gt;
L_0x00D6:&lt;br /&gt;
	JMP	L_0x0102   ; jmp function exit&lt;br /&gt;
&lt;br /&gt;
L_0x00DA:&lt;br /&gt;
;---------------------------------------------------------&lt;br /&gt;
;      Sum_n_loop = Sum_n_loop + N&lt;br /&gt;
;---------------------------------------------------------&lt;br /&gt;
	LDD	XL,Y + 2   ; summ_n_loop &lt;br /&gt;
	LDD	XH,Y + 3&lt;br /&gt;
	LD	r16,X+     ; into r16:r17&lt;br /&gt;
	LD	r17,X&lt;br /&gt;
	LDD	XL,Y + 0   ; N&lt;br /&gt;
	LDD	XH,Y + 1&lt;br /&gt;
	LD	r20,X+     ; into r20:r21&lt;br /&gt;
	LD	r21,X&lt;br /&gt;
	ADD	r16,r20    ; add      r16, r20&lt;br /&gt;
	ADC	r17,r21    ; add+cy   r17, r21&lt;br /&gt;
	LDD	XL,Y + 2   ; &lt;br /&gt;
	LDD	XH,Y + 3&lt;br /&gt;
	ST	X+,r16     ; store sum&lt;br /&gt;
	ST	X,r17&lt;br /&gt;
;---------------------------------------------------------&lt;br /&gt;
;      Decr N&lt;br /&gt;
;---------------------------------------------------------&lt;br /&gt;
	LDD	XL,Y + 0&lt;br /&gt;
	LDD	XH,Y + 1&lt;br /&gt;
	CALL	L_0x0114&lt;br /&gt;
;---------------------------------------------------------&lt;br /&gt;
;   Wend&lt;br /&gt;
;---------------------------------------------------------&lt;br /&gt;
	JMP	L_0x00C0 ; reenter loop&lt;br /&gt;
;---------------------------------------------------------&lt;br /&gt;
L_0x0102:&lt;br /&gt;
	RET      ; end function&lt;br /&gt;
;---------------------------------------------------------&lt;br /&gt;
; library function : decrement integer&lt;br /&gt;
;---------------------------------------------------------&lt;br /&gt;
L_0x0114:&lt;br /&gt;
	LD	ZL,X+&lt;br /&gt;
	LD	ZH,X&lt;br /&gt;
	SBIW	ZL,0x0001&lt;br /&gt;
	ST	X,ZH&lt;br /&gt;
	ST	-X,ZL&lt;br /&gt;
	RET&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Remark''': Das reine Register-rechnen (GCC) macht Bascom nicht. Er arbeitet immer im SRAM , brav mit Load &amp;amp; Store. (PicNick)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Berechnung mit rekursiver Funktion ==&lt;br /&gt;
&lt;br /&gt;
'''Quellcodes:'''&lt;br /&gt;
&lt;br /&gt;
{{Codevergleich|avr-gcc|BASCOM&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
unsigned int &lt;br /&gt;
sum_n_rekursiv (unsigned int n)&lt;br /&gt;
{&lt;br /&gt;
   if (n == 0)&lt;br /&gt;
      return 0;&lt;br /&gt;
&lt;br /&gt;
   return n + sum_n_rekursiv (n-1);	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
???&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
'''Compilat:'''&lt;br /&gt;
&lt;br /&gt;
{{Codevergleich|avr-gcc|BASCOM&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
00000000 &amp;lt;sum_n_rekursiv&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
unsigned int &lt;br /&gt;
sum_n_rekursiv (unsigned int n)&lt;br /&gt;
{&lt;br /&gt;
   0:	push	r28&lt;br /&gt;
   2:	push	r29&lt;br /&gt;
   4:	movw	r28, r24&lt;br /&gt;
   if (n == 0)&lt;br /&gt;
   6:	sbiw	r24, 0x00&lt;br /&gt;
   8:	breq	.+8     ; 0x12&lt;br /&gt;
      return 0;&lt;br /&gt;
&lt;br /&gt;
   return n + sum_n_rekursiv (n-1);	&lt;br /&gt;
   a:	sbiw	r24, 0x01&lt;br /&gt;
   c:	rcall	.-14    ; 0x0&lt;br /&gt;
   e:	add	r24, r28&lt;br /&gt;
  10:	adc	r25, r29&lt;br /&gt;
}  &lt;br /&gt;
  12:	pop	r29&lt;br /&gt;
  14:	pop	r28&lt;br /&gt;
  16:	ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
daraus macht der Keil-ARM7 folgendes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
*** CODE SEGMENT '?PR?sum_n_rekursiv?A?main':&lt;br /&gt;
  283: unsigned int sum_n_rekursiv (unsigned int n)&lt;br /&gt;
 00  STMDB       R13!,{R4,LR}&lt;br /&gt;
 04  MOV         R4,R0 ; n&lt;br /&gt;
  285:    if (n == 0)&lt;br /&gt;
 08  MOV         R0,R4 ; n&lt;br /&gt;
 0C  CMP         R0,#0x0000 ; n&lt;br /&gt;
 10  BNE         L_9  ; Targ=0x1C&lt;br /&gt;
  286:       return 0;&lt;br /&gt;
 14  MOV         R0,#0x0&lt;br /&gt;
 18  B           L_10  ; Targ=0x30&lt;br /&gt;
 1C          L_9:&lt;br /&gt;
  288:    return n + sum_n_rekursiv (n-1); &lt;br /&gt;
 1C  MOV         R0,R4 ; n&lt;br /&gt;
 20  SUB         R0,R0,#0x0001 ; n&lt;br /&gt;
 24  BL          sum_n_rekursiv?A  ; Targ=0x0&lt;br /&gt;
 28  MOV         R1,R4 ; n&lt;br /&gt;
 2C  ADD         R0,R1,R0 ; n&lt;br /&gt;
  289: }&lt;br /&gt;
 30          L_10:&lt;br /&gt;
 30  LDMIA       R13!,{R4}&lt;br /&gt;
 34  LDMIA       R13!,{R3}&lt;br /&gt;
 38  BX          R3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
???&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Berechnung durch Formel ==&lt;br /&gt;
&lt;br /&gt;
'''Quellcodes:'''&lt;br /&gt;
{{Codevergleich|avr-gcc|BASCOM&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
unsigned int &lt;br /&gt;
sum_n_formel (unsigned int n)&lt;br /&gt;
{&lt;br /&gt;
   return n*(n+1) / 2;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Declare Function Sum_n_loop(byval I As Integer) As Integer&lt;br /&gt;
&lt;br /&gt;
Dim X As Integer&lt;br /&gt;
&lt;br /&gt;
'Start&lt;br /&gt;
&lt;br /&gt;
   X = Sum_n_loop(10)&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
' -----&lt;br /&gt;
&lt;br /&gt;
Function Sum_n_loop(byval I As Integer)&lt;br /&gt;
&lt;br /&gt;
   X = I + 1&lt;br /&gt;
   X = X * I&lt;br /&gt;
&lt;br /&gt;
   Sum_n_loop = X / 2&lt;br /&gt;
&lt;br /&gt;
End Function&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Codevergleich|avr-gcc|BASCOM&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
00000000 &amp;lt;sum_n_formel&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
unsigned int &lt;br /&gt;
sum_n_formel (unsigned int n)&lt;br /&gt;
{&lt;br /&gt;
   return n*(n+1) / 2;&lt;br /&gt;
   0:	mul	r24, r24&lt;br /&gt;
   2:	movw	r18, r0&lt;br /&gt;
   4:	mul	r24, r25&lt;br /&gt;
   6:	add	r19, r0&lt;br /&gt;
   8:	mul	r25, r24&lt;br /&gt;
   a:	add	r19, r0&lt;br /&gt;
   c:	eor	r1, r1&lt;br /&gt;
   e:	add	r18, r24&lt;br /&gt;
  10:	adc	r19, r25&lt;br /&gt;
}&lt;br /&gt;
  12:	movw	r24, r18&lt;br /&gt;
  14:	lsr	r25&lt;br /&gt;
  16:	ror	r24&lt;br /&gt;
  18:	ret&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Es geht auch mit deutlich weniger Registern im ARM7&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
*** CODE SEGMENT '?PR?sum_n_formel?A?main':&lt;br /&gt;
  284: sum_n_formel (unsigned int n)&lt;br /&gt;
 00  MOV         R2,R0 ; n&lt;br /&gt;
  286:    return n*(n+1) / 2;&lt;br /&gt;
 04  MOV         R1,R2 ; n&lt;br /&gt;
 08  ADD         R1,R1,#0x0001 ; n&lt;br /&gt;
 0C  MOV         R0,R2 ; n&lt;br /&gt;
 10  MUL         R0,R1,R0&lt;br /&gt;
 14  MOV         R0,R0,LSR #1&lt;br /&gt;
  287: }&lt;br /&gt;
 18  BX          R14&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
???&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Interrupt-Routinen=&lt;br /&gt;
Auch diese Beispiele machen nicht viel. Das erste zählt nur eine 16-Bit Variable hoch, das zweite macht nichts weiter, als ein Funktionsaufruf.&lt;br /&gt;
&lt;br /&gt;
==Eine Variable hochzählen==&lt;br /&gt;
&lt;br /&gt;
'''Quellcodes:'''&lt;br /&gt;
&lt;br /&gt;
{{Codevergleich|avr-gcc|BASCOM&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/signal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int volatile count;&lt;br /&gt;
&lt;br /&gt;
SIGNAL (SIG_OVERFLOW0)&lt;br /&gt;
{&lt;br /&gt;
   count++;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
'''Compilat:'''&lt;br /&gt;
&lt;br /&gt;
{{Codevergleich|avr-gcc|BASCOM&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
__vector_9:&lt;br /&gt;
   push __zero_reg__&lt;br /&gt;
   push __tmp_reg__&lt;br /&gt;
   in __tmp_reg__,__SREG__&lt;br /&gt;
   push __tmp_reg__&lt;br /&gt;
   clr __zero_reg__&lt;br /&gt;
   push r24&lt;br /&gt;
   push r25&lt;br /&gt;
&lt;br /&gt;
   lds r24,count&lt;br /&gt;
   lds r25,(count)+1&lt;br /&gt;
   adiw r24,1&lt;br /&gt;
   sts (count)+1,r25&lt;br /&gt;
   sts count,r24&lt;br /&gt;
&lt;br /&gt;
   pop r25&lt;br /&gt;
   pop r24&lt;br /&gt;
   pop __tmp_reg__&lt;br /&gt;
   out __SREG__,__tmp_reg__&lt;br /&gt;
   pop __tmp_reg__&lt;br /&gt;
   pop __zero_reg__&lt;br /&gt;
   reti&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Variable holen, addieren, wegschreiben.. den Rest macht der ARM7 selbst. Viel interessanter ist, das der ARM den Counter in ein Register kriegt, der AVR aber über 2 Register rechnen muss (r24 und r25). Dafür muss aber der Arm 2 LDR ausführen um an die Countervariable zu kommen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
*** CODE SEGMENT '?PR?ISR?A?main':&lt;br /&gt;
  288:     count++;&lt;br /&gt;
 00  LDR         R0,=count ; count&lt;br /&gt;
 04  LDR         R1,[R0,#0x0] ; count&lt;br /&gt;
 08  ADD         R1,R1,#0x0001&lt;br /&gt;
 0C  STR         R1,[R0,#0x0] ; count&lt;br /&gt;
 10  BX          R14&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Der Code ist auf Grund der Architektur nicht direkt vergleichbar mit dem AVR. Der Arm 7 besitzt einen eigenen Interrupt Stack, Befehle um ganze Registersätze zu popen/puschen, einen Vectorinterruptcontroller und User/Supervisor Prioritätsebenen, ähnlich der einer x86 CPU. Das wäre als wolle man avr-gcc und Bascom vergleichen :)&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Eine Funktion aufrufen==&lt;br /&gt;
&lt;br /&gt;
'''Quellcodes:'''&lt;br /&gt;
{{Codevergleich|avr-gcc|BASCOM&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/signal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
extern void foo();&lt;br /&gt;
&lt;br /&gt;
SIGNAL (SIG_OVERFLOW1)&lt;br /&gt;
{&lt;br /&gt;
   foo();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Compilat:'''&lt;br /&gt;
&lt;br /&gt;
{{Codevergleich|avr-gcc|BASCOM&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
__vector_8:&lt;br /&gt;
   push __zero_reg__&lt;br /&gt;
   push __tmp_reg__&lt;br /&gt;
   in __tmp_reg__,__SREG__&lt;br /&gt;
   push __tmp_reg__&lt;br /&gt;
   clr __zero_reg__&lt;br /&gt;
   push r18&lt;br /&gt;
   push r19&lt;br /&gt;
   push r20&lt;br /&gt;
   push r21&lt;br /&gt;
   push r22&lt;br /&gt;
   push r23&lt;br /&gt;
   push r24&lt;br /&gt;
   push r25&lt;br /&gt;
   push r26&lt;br /&gt;
   push r27&lt;br /&gt;
   push r30&lt;br /&gt;
   push r31&lt;br /&gt;
&lt;br /&gt;
   rcall foo&lt;br /&gt;
&lt;br /&gt;
   pop r31&lt;br /&gt;
   pop r30&lt;br /&gt;
   pop r27&lt;br /&gt;
   pop r26&lt;br /&gt;
   pop r25&lt;br /&gt;
   pop r24&lt;br /&gt;
   pop r23&lt;br /&gt;
   pop r22&lt;br /&gt;
   pop r21&lt;br /&gt;
   pop r20&lt;br /&gt;
   pop r19&lt;br /&gt;
   pop r18&lt;br /&gt;
   pop __tmp_reg__&lt;br /&gt;
   out __SREG__,__tmp_reg__&lt;br /&gt;
   pop __tmp_reg__&lt;br /&gt;
   pop __zero_reg__&lt;br /&gt;
   reti&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Und hier der Arm 7 Code.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
*** CODE SEGMENT '?PR?ISR?A?main':&lt;br /&gt;
  285: void ISR( void )&lt;br /&gt;
 00  STMDB       R13!,{LR}&lt;br /&gt;
  287:     foo();&lt;br /&gt;
 04  BL          foo?A  ; Targ=0x0&lt;br /&gt;
 08  LDMIA       R13!,{R3}&lt;br /&gt;
 0C  BX          R3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Der Code ist auf Grund der Architektur nicht direkt vergleichbar mit dem AVR.&lt;br /&gt;
Der Arm 7 besitzt einen eigenen Interrupt Stack, Befehle um ganze Registersätze zu popen/puschen, einen Vectorinterruptcontroller und User/Supervisor Prioritätsebenen, ähnlich der einer x86 CPU.&lt;br /&gt;
Das wäre als wolle man avr-gcc und Bascom vergleichen :)&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Sortieren mit Bubble-Sort =&lt;br /&gt;
&lt;br /&gt;
Zum Abschluss noch ein komplexeres Beispiel: Ein Array mit 8-Bit-Werten soll mit Bubble-Sort der Größe nach sortiert werden. &lt;br /&gt;
&lt;br /&gt;
Im Array wird nach dem größten Wert gesucht und dieser ans Ende getauscht. Danach macht man den Teilbereich, in dem man das Maximum sucht, um 1 kleiner, bis man fertig ist. Die größten Zahlen wandern wie Blasen nach oben, daher der Name ''Bubble-Sort'' für diesen Sortier-Algorithmus.&lt;br /&gt;
&lt;br /&gt;
'''Variablen:'''&lt;br /&gt;
* &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt; Array-Größe&lt;br /&gt;
* &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; das Array&lt;br /&gt;
* &amp;lt;tt&amp;gt;i&amp;lt;/tt&amp;gt; Größe der Teilbereichs&lt;br /&gt;
* &amp;lt;tt&amp;gt;j&amp;lt;/tt&amp;gt; Laufvariable durch den Teilbereich&lt;br /&gt;
&lt;br /&gt;
'''Quellcodes:'''&lt;br /&gt;
&lt;br /&gt;
{{Codevergleich|avr-gcc|BASCOM&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;limits.h&amp;gt;&lt;br /&gt;
#include &amp;lt;inttypes.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void &lt;br /&gt;
bubble_sort (uint8_t n, char * a)&lt;br /&gt;
{&lt;br /&gt;
   uint8_t i;&lt;br /&gt;
&lt;br /&gt;
   // Bereich schrumpft von n auf 2&lt;br /&gt;
   for (i = n; i &amp;gt;= 2; i--)&lt;br /&gt;
   {&lt;br /&gt;
      char max = CHAR_MIN;&lt;br /&gt;
      uint8_t j, j_max;&lt;br /&gt;
&lt;br /&gt;
      // im Bereich nach MAX suchen&lt;br /&gt;
      for (j = 0; j &amp;lt; i; j++)&lt;br /&gt;
      {&lt;br /&gt;
         if (a[j] &amp;gt;= max)&lt;br /&gt;
         {&lt;br /&gt;
            // MAX und Pos. merken&lt;br /&gt;
            j_max = j;&lt;br /&gt;
            max   = a[j_max];&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // MAX ans Ende tauschen&lt;br /&gt;
      a[j_max] = a[i-1];&lt;br /&gt;
      a[i-1]   = max;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
'''Compilat:'''&lt;br /&gt;
&lt;br /&gt;
{{Codevergleich|avr-gcc|BASCOM&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
00000000 &amp;lt;bubble_sort&amp;gt;:&lt;br /&gt;
{&lt;br /&gt;
   uint8_t i;&lt;br /&gt;
&lt;br /&gt;
   // Bereich schrumpft von n auf 2&lt;br /&gt;
   for (i = n; i &amp;gt;= 2; i--)&lt;br /&gt;
   0:	cpi	r24, 0x02&lt;br /&gt;
   2:	brcs	.+54     ; 0x3a&lt;br /&gt;
   4:	movw	r26, r22&lt;br /&gt;
   6:	add	r26, r24&lt;br /&gt;
   8:	adc	r27, r1&lt;br /&gt;
   a:	sbiw	r26, 0x01&lt;br /&gt;
   {&lt;br /&gt;
      char max = CHAR_MIN;&lt;br /&gt;
   c:	ldi	r20, 0x80&lt;br /&gt;
      uint8_t j, j_max;&lt;br /&gt;
&lt;br /&gt;
      // im Bereich nach MAX suchen&lt;br /&gt;
      for (j = 0; j &amp;lt; i; j++)&lt;br /&gt;
   e:	ldi	r19, 0x00&lt;br /&gt;
  10:	cp	r19, r24&lt;br /&gt;
  12:	brcc	.+18     ; 0x26&lt;br /&gt;
  14:	movw	r30, r22&lt;br /&gt;
      {&lt;br /&gt;
         if (a[j] &amp;gt;= max)&lt;br /&gt;
  16:	ld	r18, Z+&lt;br /&gt;
  18:	cp	r18, r20&lt;br /&gt;
  1a:	brlt	.+4      ; 0x20&lt;br /&gt;
         {&lt;br /&gt;
            // MAX und Pos. merken&lt;br /&gt;
            j_max = j;&lt;br /&gt;
  1c:	mov	r21, r19&lt;br /&gt;
            max   = a[j_max];&lt;br /&gt;
  1e:	mov	r20, r18&lt;br /&gt;
  20:	subi	r19, 0xFF&lt;br /&gt;
  22:	cp	r19, r24&lt;br /&gt;
  24:	brcs	.-16     ; 0x16&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // MAX ans Ende tauschen&lt;br /&gt;
      a[j_max] = a[i-1];&lt;br /&gt;
  26:	movw	r30, r22&lt;br /&gt;
  28:	add	r30, r21&lt;br /&gt;
  2a:	adc	r31, r1&lt;br /&gt;
  2c:	ld	r18, X&lt;br /&gt;
  2e:	st	Z, r18&lt;br /&gt;
      a[i-1]   = max;&lt;br /&gt;
  30:	st	X, r20&lt;br /&gt;
  32:	subi	r24, 0x01&lt;br /&gt;
  34:	sbiw	r26, 0x01&lt;br /&gt;
  36:	cpi	r24, 0x02&lt;br /&gt;
  38:	brcc	.-46     ; 0xc&lt;br /&gt;
  3a:	ret&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Und hier das Ganze noch mal als ARM7 Code&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
*** CODE SEGMENT '?PR?bubble_sort?A?main':&lt;br /&gt;
  285: void bubble_sort (uint8_t n, char * a)&lt;br /&gt;
 00  STMDB       R13!,{R4-R6}&lt;br /&gt;
 04  MOV         R3,R0 ; n&lt;br /&gt;
  286: {&lt;br /&gt;
  290:    for (i = n; i &amp;gt;= 2; i--)&lt;br /&gt;
 08  MOV         R0,R3 ; n&lt;br /&gt;
 0C  B           L_11  ; Targ=0xD4&lt;br /&gt;
 10          L_12:&lt;br /&gt;
  291:    {&lt;br /&gt;
  292:       char max = CHAR_MIN;&lt;br /&gt;
 10  MOV         R3,#0x0&lt;br /&gt;
 14  MOV         R6,R3 ; max&lt;br /&gt;
  296:       for (j = 0; j &amp;lt; i; j++)&lt;br /&gt;
 18  B           L_16  ; Targ=0x64&lt;br /&gt;
 1C          L_17:&lt;br /&gt;
  298:          if (a[j] &amp;gt;= max)&lt;br /&gt;
 1C  MOV         R4,R3 ; j&lt;br /&gt;
 20  MOV         R5,R4,LSL #24 ; j&lt;br /&gt;
 24  MOV         R5,R5,LSR #24&lt;br /&gt;
 28  MOV         R4,R1 ; a&lt;br /&gt;
 2C  LDRB        R4,[R4,+R5]&lt;br /&gt;
 30  MOV         R5,R6 ; max&lt;br /&gt;
 34  MOV         R5,R5,LSL #24 ; max&lt;br /&gt;
 38  MOV         R5,R5,LSR #24&lt;br /&gt;
 3C  CMP         R4,R5&lt;br /&gt;
 40  BCC         L_14  ; Targ=0x5C&lt;br /&gt;
  301:             j_max = j;&lt;br /&gt;
 44  MOV         R2,R3 ; j&lt;br /&gt;
  302:             max   = a[j_max];&lt;br /&gt;
 48  MOV         R4,R2 ; j_max&lt;br /&gt;
 4C  MOV         R5,R4,LSL #24 ; j_max&lt;br /&gt;
 50  MOV         R5,R5,LSR #24&lt;br /&gt;
 54  MOV         R4,R1 ; a&lt;br /&gt;
 58  LDRB        R6,[R4,+R5]&lt;br /&gt;
  304:       }&lt;br /&gt;
 5C          L_14:&lt;br /&gt;
 5C  ADD         R3,R3,#0x0001 ; j&lt;br /&gt;
 60  AND         R3,R3,#0x00FF&lt;br /&gt;
 64          L_16:&lt;br /&gt;
 64  MOV         R4,R0 ; i&lt;br /&gt;
 68  MOV         R5,R4,LSL #24 ; i&lt;br /&gt;
 6C  MOV         R5,R5,LSR #24&lt;br /&gt;
 70  MOVR        R4,R3 ; j&lt;br /&gt;
 74  MOV         R4,R4,LSL #24 ; j&lt;br /&gt;
 78  MOV         R4,R4,LSR #24&lt;br /&gt;
 7C  CMP         R4,R5&lt;br /&gt;
 80  BCC         L_17  ; Targ=0x1C&lt;br /&gt;
  307:       a[j_max] = a[i-1];&lt;br /&gt;
 84  MOV         R3,R0 ; i&lt;br /&gt;
 88  MOV         R4,R3,LSL #24 ; i&lt;br /&gt;
 8C  MOV         R4,R4,LSR #24&lt;br /&gt;
 90  MOV         R3,R1 ; a&lt;br /&gt;
 94  ADD         R3,R3,R4 ; a&lt;br /&gt;
 98  LDRB        R3,[R3,#0xFFFFFFFF]&lt;br /&gt;
 9C  MOV         R4,R2 ; j_max&lt;br /&gt;
 A0  MOV         R5,R4,LSL #24 ; j_max&lt;br /&gt;
 A4  MOV         R5,R5,LSR #24&lt;br /&gt;
 A8  MOV         R4,R1 ; a&lt;br /&gt;
 AC  STRB        R3,[R4,+R5]&lt;br /&gt;
  308:       a[i-1]   = max;&lt;br /&gt;
 B0  MOV         R3,R6 ; max&lt;br /&gt;
 B4  MOV         R4,R0 ; i&lt;br /&gt;
 B8  MOV         R5,R4,LSL #24 ; i&lt;br /&gt;
 BC  MOV         R5,R5,LSR #24&lt;br /&gt;
 C0  MOV         R4,R1 ; a&lt;br /&gt;
 C4  ADD         R4,R4,R5 ; a&lt;br /&gt;
 C8  STRB        R3,[R4,#0xFFFFFFFF]&lt;br /&gt;
  309:    }&lt;br /&gt;
 CC  SUB         R0,R0,#0x0001 ; i&lt;br /&gt;
 D0  AND         R0,R0,#0x00FF&lt;br /&gt;
 D4          L_11:&lt;br /&gt;
 D4  MOV         R3,R0 ; i&lt;br /&gt;
 D8  MOV         R3,R3,LSL #24 ; i&lt;br /&gt;
 DC  MOV         R3,R3,LSR #24&lt;br /&gt;
 E0  CMP         R3,#0x0002&lt;br /&gt;
 E4  BGE         L_12  ; Targ=0x10&lt;br /&gt;
  310: }&lt;br /&gt;
 E8  LDMIA       R13!,{R4-R6}&lt;br /&gt;
 EC  BX          R14&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Die Codes wurden etwas nachkommentiert und -formatiert, um besser den Zusammenhang mit der Quelle durchblicken zu können.&lt;br /&gt;
&lt;br /&gt;
= Zusammenfassung =&lt;br /&gt;
&lt;br /&gt;
Für diese drei Summier-Routinen erhält man folgende Ergebnisse für Laufzeit und Platzverbrauch. Die Laufzeittest wurden gemacht für N=20, d.h. es wurden die ersten 20 ganzen Zahlen aufsummiert.&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! Verbrauch an Flash (in Bytes) || avr-gcc || BASCOM&lt;br /&gt;
|- &lt;br /&gt;
 |&amp;lt;tt&amp;gt;sum_n_loop&amp;lt;/tt&amp;gt; || 20 || ???&lt;br /&gt;
|- &lt;br /&gt;
 |&amp;lt;tt&amp;gt;sum_n_rekursiv&amp;lt;/tt&amp;gt; || 24 || ???&lt;br /&gt;
|- &lt;br /&gt;
 |&amp;lt;tt&amp;gt;sum_n_formel&amp;lt;/tt&amp;gt; || 26 || ???&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! Verbrauch an Zeit (in CPU-Zyklen) || avr-gcc || BASCOM&lt;br /&gt;
|-&lt;br /&gt;
 |&amp;lt;tt&amp;gt;sum_n_loop (20)&amp;lt;/tt&amp;gt; || 191 || ???&lt;br /&gt;
|- &lt;br /&gt;
 |&amp;lt;tt&amp;gt;sum_n_rekursiv (20)&amp;lt;/tt&amp;gt; || 477 || ???&lt;br /&gt;
|- &lt;br /&gt;
 |&amp;lt;tt&amp;gt;sum_n_formel (20)&amp;lt;/tt&amp;gt; || 19 || ???&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
* [[Sourcevergleich]]&lt;br /&gt;
* [[avr-gcc]]&lt;br /&gt;
* [[Bascom]]&lt;br /&gt;
* [[AVR]]&lt;br /&gt;
* [[ARM]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Quellcode Bascom]]&lt;br /&gt;
[[Kategorie:Quellcode C]]&lt;br /&gt;
[[Kategorie:Quellcode Assembler AVR]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:Praxis]]&lt;/div&gt;</summary>
		<author><name>MrByte</name></author>	</entry>

	</feed>