<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki.leese-family.de/index.php?action=history&amp;feed=atom&amp;title=Assembler%2FHello_World</id>
	<title>Assembler/Hello World - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.leese-family.de/index.php?action=history&amp;feed=atom&amp;title=Assembler%2FHello_World"/>
	<link rel="alternate" type="text/html" href="https://wiki.leese-family.de/index.php?title=Assembler/Hello_World&amp;action=history"/>
	<updated>2026-06-30T17:14:25Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Ringo&#039;s Wiki</subtitle>
	<generator>MediaWiki 1.44.5</generator>
	<entry>
		<id>https://wiki.leese-family.de/index.php?title=Assembler/Hello_World&amp;diff=3&amp;oldid=prev</id>
		<title>Ringo: Die Seite wurde neu angelegt: „ == Das erste lauffähige Programm (Hello World!) ==  Wie in jedem guten Tutorial ;) zum erlernen einer Programmiersprache gibt&#039;s ein obligatorisches &quot;Hello Wo…“</title>
		<link rel="alternate" type="text/html" href="https://wiki.leese-family.de/index.php?title=Assembler/Hello_World&amp;diff=3&amp;oldid=prev"/>
		<updated>2019-03-19T10:37:18Z</updated>

		<summary type="html">&lt;p&gt;Die Seite wurde neu angelegt: „ == Das erste lauffähige Programm (Hello World!) ==  Wie in jedem guten Tutorial ;) zum erlernen einer Programmiersprache gibt&amp;#039;s ein obligatorisches &amp;quot;Hello Wo…“&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;
== Das erste lauffähige Programm (Hello World!) ==&lt;br /&gt;
&lt;br /&gt;
Wie in jedem guten Tutorial ;) zum erlernen einer Programmiersprache gibt&amp;#039;s ein obligatorisches &amp;quot;Hello World!&amp;quot;-Programm.&lt;br /&gt;
&lt;br /&gt;
zuerst der Code, dann die Erläuterungen dazu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 01 format ELF64 executable at 0000000100000000h	; put image over 32-bit limit&lt;br /&gt;
 02&lt;br /&gt;
 03 segment readable executable&lt;br /&gt;
 04&lt;br /&gt;
 05 entry $&lt;br /&gt;
 06&lt;br /&gt;
 07     mov edx, msg_size	; CPU zero extends 32-bit operation to 64-bit&lt;br /&gt;
 08				; we can use less bytes than in case mov rdx,...&lt;br /&gt;
 09     lea rsi, [msg]&lt;br /&gt;
 10     mov edi, 1		; STDOUT&lt;br /&gt;
 11     mov eax, 1		; sys_write&lt;br /&gt;
 12     syscall&lt;br /&gt;
 13&lt;br /&gt;
 14     xor edi, edi		; exit code 0&lt;br /&gt;
 15     mov eax, 60		; sys_exit&lt;br /&gt;
 16     syscall&lt;br /&gt;
 17&lt;br /&gt;
 18 segment readable writeable&lt;br /&gt;
 19&lt;br /&gt;
 20 msg db &amp;#039;Hello World! 64-Bit-Version&amp;#039;, 0xA&lt;br /&gt;
 21 msg_size = $ - msg&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der 1. Zeile wird angegeben, dass diese Datei eine Ausführbare 64-Bit [https://en.wikipedia.org/wiki/Executable_and_Linkable_Format ELF64] Datei sein soll.&amp;lt;br /&amp;gt;&lt;br /&gt;
In der 3. Zeile wird ein lesbarer (readable) und ausführbarer (executable) Bereich begonnen.&amp;lt;br /&amp;gt;&lt;br /&gt;
In der 5. Zeile wird der Einstiegspunkt des ausführbaren Bereichs gekennzeichnet.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ab der 7. Zeile wird es interessant! Hier wird die Länge der Zeichenkette, die wir ausgeben wollen in das CPU-Register &amp;#039;&amp;#039;&amp;quot;edx&amp;quot;&amp;#039;&amp;#039; kopiert (ge&amp;#039;&amp;#039;&amp;#039;mov&amp;#039;&amp;#039;&amp;#039;ed)&amp;lt;br /&amp;gt;&lt;br /&gt;
Die Daten dafür beginnen ab Zeile 18 mit &amp;#039;&amp;#039;&amp;quot;segment readable writeable&amp;quot;&amp;#039;&amp;#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
In Zeile 20 wird der String, den wir ausgeben wollen als &amp;#039;&amp;#039;&amp;#039;D&amp;#039;&amp;#039;&amp;#039;aten&amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039;ytes geschrieben. Wie man sehen kann, wird dem Eigentlichen String noch ein &amp;#039;&amp;#039;&amp;#039;0xA&amp;#039;&amp;#039;&amp;#039; angehangen, dies ist das Zeichen für einen Zeilenumbruch unter Linux.&amp;lt;br /&amp;gt;&lt;br /&gt;
In anderen Programmiersprachen wie C oder PHP realisiert man das normalerweise mit einem &amp;#039;&amp;#039;&amp;#039;\n&amp;#039;&amp;#039;&amp;#039;, was auch nichts anderes ist, als das 10. Symbol in der ASCII-Tabelle. Man könnte anstelle des &amp;#039;&amp;#039;&amp;#039;0xA&amp;#039;&amp;#039;&amp;#039; auch &amp;#039;&amp;#039;&amp;#039;0x0A&amp;#039;&amp;#039;&amp;#039; oder &amp;#039;&amp;#039;&amp;#039;10&amp;#039;&amp;#039;&amp;#039; schreiben.&amp;lt;br /&amp;gt;&lt;br /&gt;
Die Adresse des Strings wird in &amp;#039;&amp;#039;&amp;#039;msg&amp;#039;&amp;#039;&amp;#039; gespeichert! Diese wird auch gleich in Zeile 21 verwendet, um die String-Länge zu berechnen! &amp;#039;&amp;#039;&amp;#039;$&amp;#039;&amp;#039;&amp;#039; ist dabei die aktuelle Adresse und davon wird die Adresse von msg abgezogen, somit hat man die String-Länge, die in msg_size gespeichert wird und in Zeile 7 verwendet wird.&lt;br /&gt;
&lt;br /&gt;
In der 9. Zeile wird die Speicheradresse von &amp;#039;&amp;#039;&amp;#039;msg&amp;#039;&amp;#039;&amp;#039; ins &amp;#039;&amp;#039;&amp;#039;rsi&amp;#039;&amp;#039;&amp;#039;-Register geladen. &amp;lt;br /&amp;gt;&lt;br /&gt;
In der 10. und 11. Zeile wird festgelegt, dass die Ausgabe nach stdout geschrieben werden soll.&amp;lt;br /&amp;gt;&lt;br /&gt;
In der 12. Zeile wird die Ausgabe ausgeführt.&lt;br /&gt;
&lt;br /&gt;
In der 14. und 15. Zeile wird der exit_code auf 0 gesetzt.&amp;lt;br /&amp;gt;&lt;br /&gt;
In der 16. Zeile wird das Programm beendet.&lt;br /&gt;
&lt;br /&gt;
Jedes Programm muss Ordnungsgemäß wie in Zeile 14 bis 16 beendet werden, wobei der exit_code natürlich angepasst werden kann, um bestimmte Fehlerzustände zurückzugeben.&amp;lt;br /&amp;gt;&lt;br /&gt;
Beendet man Ein Programm nicht richtig, so arbeitet die CPU einfach an der nächsten Speicherstelle weiter, da man aber nicht weiß, was nach dem normalen Programm kommt, kann alles mögliche ausgeführt werden, was wiederum eine Hintertür einbaut.&lt;br /&gt;
&lt;br /&gt;
Kommentare werden in Assembler mit einem Semikolon (;) eingeleitet und enden am Ende der Zeile.&lt;/div&gt;</summary>
		<author><name>Ringo</name></author>
	</entry>
</feed>