<?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=MovGP0</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=MovGP0"/>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Spezial:Beitr%C3%A4ge/MovGP0"/>
		<updated>2026-04-12T08:34:55Z</updated>
		<subtitle>Benutzerbeiträge</subtitle>
		<generator>MediaWiki 1.25.1</generator>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=GNU_Assembler&amp;diff=12743</id>
		<title>GNU Assembler</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=GNU_Assembler&amp;diff=12743"/>
				<updated>2007-09-21T08:13:25Z</updated>
		
		<summary type="html">&lt;p&gt;MovGP0: /* GNU Assembler */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=GNU Assembler=&lt;br /&gt;
&lt;br /&gt;
Eigentlich ist es ein normales [[Avr-gcc|GCC-Project]], nur dass kein C-Programm da ist. Daher muss die Definition von der &amp;quot;main&amp;quot;-Funktion, die ja obligat ist, im Assembler erfolgen.    &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;                ; das gibt den Controllertyp an&lt;br /&gt;
&lt;br /&gt;
.text                              ; was nun folgt, gehört in den FLASH-Speicher&lt;br /&gt;
&lt;br /&gt;
.global main                       ; main ist auch in anderen Modulen bekannt&lt;br /&gt;
&lt;br /&gt;
main:                              ; zu 'main' wird nach Reset hingesprungen&lt;br /&gt;
        ;....   eigene befehle&lt;br /&gt;
Hauptschleife:                     ; ein Sprunglabel&lt;br /&gt;
        ;....   eigene befehle&lt;br /&gt;
        rjmp Hauptschleife         ; immer wiederholen&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Und das wars auch schon. &lt;br /&gt;
&lt;br /&gt;
Es bietet sich an, GCC aufzurufen und ihn die Arbeit an Assembler und Linker delegieren zu lassen. Standard Datei-Erweiterung dazu ist &amp;lt;code&amp;gt;*.S&amp;lt;/code&amp;gt;:&lt;br /&gt;
 avr-gcc -o beispiel.elf -mmcu=atmega8 beispiel.S&lt;br /&gt;
Falls die Plattform Ärger mit Groß/Kleinschreibung macht wie Windows, dann geht auch&lt;br /&gt;
 avr-gcc -x assembler-with-cpp -o beispiel.elf -mmcu=atmega8 beispiel.ss&lt;br /&gt;
&lt;br /&gt;
GCC legt die Vektortabelle selbständig an und nimmt die richtigen Einträge vor. Dies gilt auch für den RESET-Vektor. Bevor zu &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; gesprungen wird, wird noch eine kleine Initialisierung gemacht: Stackpointer setzen und Y-Reg darauf initialisieren, um es als Framepointer nutzen zu können. &lt;br /&gt;
&lt;br /&gt;
Falls man eine IRQ bedienen möchte, schreibt man&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.text&lt;br /&gt;
.global SIG_OVERFLOW0   ; alternativ: __vector_9 schreiben, wenn 9 die IRQ-Nummer ist&lt;br /&gt;
                        ; SIG_XXX ist ein #define aus avr/ioxxxx.h&lt;br /&gt;
                        ; das durch #include &amp;lt;avr/io.h&amp;gt; mitincludet wird&lt;br /&gt;
&lt;br /&gt;
SIG_OVERFLOW0:          ; dito&lt;br /&gt;
       ; ISR-Code&lt;br /&gt;
       reti&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dadurch wird an der richtigen Stelle der Vektortabelle ein Eintrag veranlasst.&lt;br /&gt;
&lt;br /&gt;
Ein Disassemble des Maschinencodes sieht dann so aus (Vectab gekürzt):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Disassembly of section .text:&lt;br /&gt;
&lt;br /&gt;
00000000 &amp;lt;__vectors&amp;gt;:&lt;br /&gt;
   0:	12 c0       	rjmp	.+36     	; 0x26&lt;br /&gt;
   2:	18 c0       	rjmp	.+48     	; 0x34&lt;br /&gt;
   4:	17 c0       	rjmp	.+46     	; 0x34&lt;br /&gt;
...&lt;br /&gt;
  12:	11 c0       	rjmp	.+34     	; 0x36&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
00000026 &amp;lt;__ctors_end&amp;gt;:&lt;br /&gt;
  26:	11 24       	eor	r1, r1&lt;br /&gt;
  28:	1f be       	out	0x3f, r1	; 63&lt;br /&gt;
  2a:	cf e5       	ldi	r28, 0x5F	; 95&lt;br /&gt;
  2c:	d4 e0       	ldi	r29, 0x04	; 4&lt;br /&gt;
  2e:	de bf       	out	0x3e, r29	; 62&lt;br /&gt;
  30:	cd bf       	out	0x3d, r28	; 61&lt;br /&gt;
  32:	02 c0       	rjmp	.+4      	; 0x38&lt;br /&gt;
&lt;br /&gt;
00000034 &amp;lt;__bad_interrupt&amp;gt;:&lt;br /&gt;
  34:	e5 cf       	rjmp	.-54     	; 0x0&lt;br /&gt;
&lt;br /&gt;
00000036 &amp;lt;__vector_9&amp;gt;:&lt;br /&gt;
  36:	18 95       	reti&lt;br /&gt;
&lt;br /&gt;
00000038 &amp;lt;main&amp;gt;:&lt;br /&gt;
  38:	ff cf       	rjmp	.-2      	; 0x38&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
&lt;br /&gt;
*[[avr-gcc]]&lt;br /&gt;
*[[AVR Assembler Einführung]]&lt;br /&gt;
*[[Sourcevergleich#GCC_GNU-Assembler|Beispiel C-Projekt mit Assembler-Modul]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:Quellcode Assembler AVR]]&lt;/div&gt;</summary>
		<author><name>MovGP0</name></author>	</entry>

	</feed>