<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://mediawiki.wissen-ahrensburg.de/index.php?action=history&amp;feed=atom&amp;title=Entwicklung_%2F_Systemprogrammierung_%2F_Assembler_%2F_Grundlagen</id>
	<title>Entwicklung / Systemprogrammierung / Assembler / Grundlagen - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.wissen-ahrensburg.de/index.php?action=history&amp;feed=atom&amp;title=Entwicklung_%2F_Systemprogrammierung_%2F_Assembler_%2F_Grundlagen"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Entwicklung_/_Systemprogrammierung_/_Assembler_/_Grundlagen&amp;action=history"/>
	<updated>2026-08-19T23:00:51Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Dokument</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=Entwicklung_/_Systemprogrammierung_/_Assembler_/_Grundlagen&amp;diff=3557&amp;oldid=prev</id>
		<title>imported&gt;Thorsten Klöhn: Import aus Zensical-Doku (Wissen Ahrensburg)</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Entwicklung_/_Systemprogrammierung_/_Assembler_/_Grundlagen&amp;diff=3557&amp;oldid=prev"/>
		<updated>2026-07-17T12:43:16Z</updated>

		<summary type="html">&lt;p&gt;Import aus Zensical-Doku (Wissen Ahrensburg)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;span id=&amp;quot;assembler-asm-auf-linux&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Assembler (ASM) auf Linux =&lt;br /&gt;
&lt;br /&gt;
Assembler (ASM) ist die &amp;#039;&amp;#039;&amp;#039;niedrigste Abstraktionsebene&amp;#039;&amp;#039;&amp;#039; der Programmierung – hier schreibst du &amp;#039;&amp;#039;&amp;#039;direkt Maschinenbefehle&amp;#039;&amp;#039;&amp;#039; für die CPU. Linux unterstützt Assembler vollständig für alle gängigen Architekturen wie &amp;#039;&amp;#039;&amp;#039;x86-64, ARM, RISC-V&amp;#039;&amp;#039;&amp;#039; und mehr.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;pushpin-warum-assembler-lernen&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 📌 Warum Assembler lernen? ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Vorteil&lt;br /&gt;
! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Maximale Performance&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Keine Overheads durch Compiler-Optimierungen oder Abstraktionen.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Hardware-Kontrolle&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Direkter Zugriff auf CPU-Features (SIMD, Cache, Register).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Verständnis&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Lernen, wie Computer &amp;#039;&amp;#039;&amp;#039;wirklich&amp;#039;&amp;#039;&amp;#039; funktionieren.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Debugging&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Binaries analysieren und Reverse Engineering betreiben.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Kernel-Entwicklung&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Linux-Kernel und Treiber nutzen Assembler für kritische Pfade.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Embedded Systems&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Mikrocontroller und Bare-Metal-Programmierung.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;building_construction-grundlagen&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 🏗️ Grundlagen ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;cpu-register-x86-64&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== CPU-Register (x86-64) ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Register&lt;br /&gt;
! Größe&lt;br /&gt;
! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rax&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rbx&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rcx&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rdx&amp;lt;/code&amp;gt;&lt;br /&gt;
| 64 Bit&lt;br /&gt;
| Allgemeine Register (A, B, C, D)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rsi&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rdi&amp;lt;/code&amp;gt;&lt;br /&gt;
| 64 Bit&lt;br /&gt;
| Source/Destination Index (für syscalls)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rbp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rsp&amp;lt;/code&amp;gt;&lt;br /&gt;
| 64 Bit&lt;br /&gt;
| Base Pointer / Stack Pointer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rip&amp;lt;/code&amp;gt;&lt;br /&gt;
| 64 Bit&lt;br /&gt;
| Instruction Pointer (aktuelle Adresse)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;r8&amp;lt;/code&amp;gt;–&amp;lt;code&amp;gt;r15&amp;lt;/code&amp;gt;&lt;br /&gt;
| 64 Bit&lt;br /&gt;
| Zusätzliche Register (x86-64)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;eflags&amp;lt;/code&amp;gt;&lt;br /&gt;
| 32 Bit&lt;br /&gt;
| Status-Flags (Zero, Carry, Overflow etc.)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;#039;&amp;#039;&amp;#039;Hinweis&amp;#039;&amp;#039;&amp;#039;: In 32-Bit-Modus heißen die Register &amp;lt;code&amp;gt;eax&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ebx&amp;lt;/code&amp;gt; etc. (32 Bit), in 16-Bit-Modus &amp;lt;code&amp;gt;ax&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;bx&amp;lt;/code&amp;gt; (16 Bit).&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;grundlegende-instruktionen&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Grundlegende Instruktionen ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Kategorie&lt;br /&gt;
! Instruktion&lt;br /&gt;
! Beispiel&lt;br /&gt;
! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Datenübertragung&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| &amp;lt;code&amp;gt;mov&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;mov $42, %rax&amp;lt;/code&amp;gt;&lt;br /&gt;
| Wert in Register laden&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &amp;lt;code&amp;gt;mov %rbx, %rcx&amp;lt;/code&amp;gt;&lt;br /&gt;
| Register kopieren&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Arithmetik&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| &amp;lt;code&amp;gt;add&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mul&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;div&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;add $10, %rax&amp;lt;/code&amp;gt;&lt;br /&gt;
| Addition&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &amp;lt;code&amp;gt;inc %rax&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;dec %rax&amp;lt;/code&amp;gt;&lt;br /&gt;
| Inkrement/Dekrement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Logik&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| &amp;lt;code&amp;gt;and&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;or&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;xor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;not&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;and $0xFF, %rax&amp;lt;/code&amp;gt;&lt;br /&gt;
| Bitweise AND&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Vergleiche&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| &amp;lt;code&amp;gt;cmp&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;cmp %rax, %rbx&amp;lt;/code&amp;gt;&lt;br /&gt;
| Vergleicht zwei Werte&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &amp;lt;code&amp;gt;test %rax, %rax&amp;lt;/code&amp;gt;&lt;br /&gt;
| Prüft auf Null&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Sprünge&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| &amp;lt;code&amp;gt;jmp&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;jmp label&amp;lt;/code&amp;gt;&lt;br /&gt;
| Unbedingter Sprung&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| &amp;lt;code&amp;gt;je&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;jne&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;jg&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;jl&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;je label&amp;lt;/code&amp;gt;&lt;br /&gt;
| Sprung wenn gleich (Equal)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Funktionsaufrufe&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| &amp;lt;code&amp;gt;call&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;call function&amp;lt;/code&amp;gt;&lt;br /&gt;
| Funktion aufrufen&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| &amp;lt;code&amp;gt;ret&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;ret&amp;lt;/code&amp;gt;&lt;br /&gt;
| Aus Funktion zurückkehren&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Stack-Operationen&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| &amp;lt;code&amp;gt;push&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pop&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;push %rax&amp;lt;/code&amp;gt;&lt;br /&gt;
| Wert auf Stack pushen&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &amp;lt;code&amp;gt;pop %rbx&amp;lt;/code&amp;gt;&lt;br /&gt;
| Wert vom Stack poppen&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;System Calls&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| &amp;lt;code&amp;gt;syscall&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;syscall&amp;lt;/code&amp;gt;&lt;br /&gt;
| Linux-Kernel aufrufen&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;speicheradressierung&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Speicheradressierung ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Modus&lt;br /&gt;
! Syntax&lt;br /&gt;
! Beispiel&lt;br /&gt;
! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Direkt&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| &amp;lt;code&amp;gt;[adresse]&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;mov $42, (%rax)&amp;lt;/code&amp;gt;&lt;br /&gt;
| Speicherzelle an Adresse in &amp;lt;code&amp;gt;%rax&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Indirekt mit Offset&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| &amp;lt;code&amp;gt;[register + offset]&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;mov $42, 8(%rbp)&amp;lt;/code&amp;gt;&lt;br /&gt;
| 8 Bytes über &amp;lt;code&amp;gt;rbp&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Indexiert&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| &amp;lt;code&amp;gt;[base + index]&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;mov (%rax, %rbx, 4), %rcx&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;rax + rbx*4&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Absolute Adresse&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| &amp;lt;code&amp;gt;adresse&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;mov msg, %rsi&amp;lt;/code&amp;gt;&lt;br /&gt;
| Adresse von &amp;lt;code&amp;gt;msg&amp;lt;/code&amp;gt; laden&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;pencil-syntax-varianten&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 📝 Syntax-Varianten ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;att-syntax-gnu-standard&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== AT&amp;amp;amp;T-Syntax (GNU Standard) ===&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Format&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;instruktion quell, ziel&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Register&amp;#039;&amp;#039;&amp;#039;: Präfix &amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt; (z. B. &amp;lt;code&amp;gt;%rax&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Immediate Werte&amp;#039;&amp;#039;&amp;#039;: Präfix &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; (z. B. &amp;lt;code&amp;gt;$42&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Speicheradressen&amp;#039;&amp;#039;&amp;#039;: Klammern (z. B. &amp;lt;code&amp;gt;(%rax)&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Kommentare&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;# Kommentar&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;mov $42, %rax    # Lade 42 in rax&lt;br /&gt;
mov %rax, %rbx   # Kopiere rax nach rbx&lt;br /&gt;
add $10, %rbx   # Addiere 10 zu rbx&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;intel-syntax-nasmyasm-standard&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Intel-Syntax (NASM/YASM Standard) ===&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Format&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;instruktion ziel, quell&amp;lt;/code&amp;gt; (umgekehrt zu AT&amp;amp;amp;T!)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Register&amp;#039;&amp;#039;&amp;#039;: Kein Präfix (z. B. &amp;lt;code&amp;gt;rax&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Immediate Werte&amp;#039;&amp;#039;&amp;#039;: Kein Präfix (z. B. &amp;lt;code&amp;gt;42&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Speicheradressen&amp;#039;&amp;#039;&amp;#039;: Klammern (z. B. &amp;lt;code&amp;gt;[rax]&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Kommentare&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;; Kommentar&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;mov rax, 42    ; Lade 42 in rax&lt;br /&gt;
mov rbx, rax   ; Kopiere rax nach rbx&lt;br /&gt;
add rbx, 10    ; Addiere 10 zu rbx&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;vergleich-att-vs-intel&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Vergleich: AT&amp;amp;amp;T vs. Intel ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Operation&lt;br /&gt;
! AT&amp;amp;amp;T&lt;br /&gt;
! Intel&lt;br /&gt;
|-&lt;br /&gt;
| Lade 42 in rax&lt;br /&gt;
| &amp;lt;code&amp;gt;mov $42, %rax&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;mov rax, 42&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Kopiere rax nach rbx&lt;br /&gt;
| &amp;lt;code&amp;gt;mov %rax, %rbx&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;mov rbx, rax&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Addiere 10 zu rbx&lt;br /&gt;
| &amp;lt;code&amp;gt;add $10, %rbx&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;add rbx, 10&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Speicherzugriff&lt;br /&gt;
| &amp;lt;code&amp;gt;mov (%rax), %rbx&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;mov rbx, [rax]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;electric_plug-system-calls-auf-linux&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 🔌 System Calls auf Linux ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;grundlagen&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Grundlagen ===&lt;br /&gt;
&lt;br /&gt;
Linux verwendet &amp;#039;&amp;#039;&amp;#039;Software-Interrupts&amp;#039;&amp;#039;&amp;#039; (oder &amp;lt;code&amp;gt;syscall&amp;lt;/code&amp;gt;-Instruktion auf x86-64) für Systemaufrufe. Jeder Syscall hat:&lt;br /&gt;
&lt;br /&gt;
* Eine &amp;#039;&amp;#039;&amp;#039;Nummer&amp;#039;&amp;#039;&amp;#039; (z. B. &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; für &amp;lt;code&amp;gt;write&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Argumente&amp;#039;&amp;#039;&amp;#039; in speziellen Registern&lt;br /&gt;
* Ein &amp;#039;&amp;#039;&amp;#039;Rückgabewert&amp;#039;&amp;#039;&amp;#039; in &amp;lt;code&amp;gt;%rax&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;syscall-nummern-finden&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Syscall-Nummern finden ===&lt;br /&gt;
&lt;br /&gt;
Die Syscall-Nummern sind in den Kernel-Headern definiert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;# x86-64 Syscall-Nummern anzeigen&lt;br /&gt;
cat /usr/include/asm/unistd_64.h&lt;br /&gt;
&lt;br /&gt;
# oder online:&lt;br /&gt;
# https://filippo.io/linux-syscall-table/&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Syscall&lt;br /&gt;
! Nummer (x86-64)&lt;br /&gt;
! Description&lt;br /&gt;
! Argumente&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;read&amp;lt;/code&amp;gt;&lt;br /&gt;
| 0&lt;br /&gt;
| Lesen aus Datei&lt;br /&gt;
| &amp;lt;code&amp;gt;rax=0&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rdi=fd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rsi=buffer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rdx=count&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;write&amp;lt;/code&amp;gt;&lt;br /&gt;
| 1&lt;br /&gt;
| Schreiben in Datei&lt;br /&gt;
| &amp;lt;code&amp;gt;rax=1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rdi=fd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rsi=buffer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rdx=count&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;open&amp;lt;/code&amp;gt;&lt;br /&gt;
| 2&lt;br /&gt;
| Datei öffnen&lt;br /&gt;
| &amp;lt;code&amp;gt;rax=2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rdi=path&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rsi=flags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rdx=mode&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;close&amp;lt;/code&amp;gt;&lt;br /&gt;
| 3&lt;br /&gt;
| Datei schließen&lt;br /&gt;
| &amp;lt;code&amp;gt;rax=3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rdi=fd&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;exit&amp;lt;/code&amp;gt;&lt;br /&gt;
| 60&lt;br /&gt;
| Prozess beenden&lt;br /&gt;
| &amp;lt;code&amp;gt;rax=60&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rdi=status&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;fork&amp;lt;/code&amp;gt;&lt;br /&gt;
| 57&lt;br /&gt;
| Prozess erzeugen&lt;br /&gt;
| &amp;lt;code&amp;gt;rax=57&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;execve&amp;lt;/code&amp;gt;&lt;br /&gt;
| 59&lt;br /&gt;
| Programm ausführen&lt;br /&gt;
| &amp;lt;code&amp;gt;rax=59&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rdi=path&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rsi=argv&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rdx=envp&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;syscall-register-x86-64&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Syscall-Register (x86-64) ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Register&lt;br /&gt;
! Argument&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rax&amp;lt;/code&amp;gt;&lt;br /&gt;
| Syscall-Nummer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rdi&amp;lt;/code&amp;gt;&lt;br /&gt;
| 1. Argument&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rsi&amp;lt;/code&amp;gt;&lt;br /&gt;
| 2. Argument&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rdx&amp;lt;/code&amp;gt;&lt;br /&gt;
| 3. Argument&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;r10&amp;lt;/code&amp;gt;&lt;br /&gt;
| 4. Argument&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;r8&amp;lt;/code&amp;gt;&lt;br /&gt;
| 5. Argument&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;r9&amp;lt;/code&amp;gt;&lt;br /&gt;
| 6. Argument&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rax&amp;lt;/code&amp;gt;&lt;br /&gt;
| Rückgabewert&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;#039;&amp;#039;&amp;#039;Hinweis&amp;#039;&amp;#039;&amp;#039;: Bei 32-Bit (x86) werden die Register &amp;lt;code&amp;gt;eax&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ebx&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ecx&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;edx&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;esi&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;edi&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ebp&amp;lt;/code&amp;gt; verwendet.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;hammer_and_wrench-tools-für-assembler-auf-linux&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 🛠️ Tools für Assembler auf Linux ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;gnu-assembler-as&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== GNU Assembler (&amp;lt;code&amp;gt;as&amp;lt;/code&amp;gt;) ===&lt;br /&gt;
&lt;br /&gt;
Der Standard-Assembler unter Linux (Teil von &amp;#039;&amp;#039;&amp;#039;Binutils&amp;#039;&amp;#039;&amp;#039;).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Installation:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;# Auf Debian/Ubuntu&lt;br /&gt;
sudo apt install binutils&lt;br /&gt;
&lt;br /&gt;
# Auf Fedora/RHEL&lt;br /&gt;
sudo dnf install binutils&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Grundlegende Befehle:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Befehl&lt;br /&gt;
! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;as [--64] file.s -o file.o&amp;lt;/code&amp;gt;&lt;br /&gt;
| Assemblieren ( &amp;lt;code&amp;gt;--64&amp;lt;/code&amp;gt; für x86-64)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ld file.o -o file&amp;lt;/code&amp;gt;&lt;br /&gt;
| Linken&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;as --64 hello.s &amp;amp;amp;&amp;amp;amp; ld hello.o -o hello&amp;lt;/code&amp;gt;&lt;br /&gt;
| Komplett: Assemblieren + Linken&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;linker-ld&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Linker (&amp;lt;code&amp;gt;ld&amp;lt;/code&amp;gt;) ===&lt;br /&gt;
&lt;br /&gt;
Kombiniert Objektdateien (&amp;lt;code&amp;gt;*.o&amp;lt;/code&amp;gt;) zu ausführbaren Programmen.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;# Einfaches Programm linken&lt;br /&gt;
ld hello.o -o hello&lt;br /&gt;
&lt;br /&gt;
# Mit Startcode (für _start anstatt main)&lt;br /&gt;
ld -e _start hello.o -o hello&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;disassembler-objdump&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Disassembler (&amp;lt;code&amp;gt;objdump&amp;lt;/code&amp;gt;) ===&lt;br /&gt;
&lt;br /&gt;
Zeigt den &amp;#039;&amp;#039;&amp;#039;Maschinencode&amp;#039;&amp;#039;&amp;#039; als lesbaren Assembler-Code an.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiele:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;# Disassemblieren einer Objektdatei&lt;br /&gt;
objdump -d hello.o&lt;br /&gt;
&lt;br /&gt;
# Disassemblieren eines Executables&lt;br /&gt;
objdump -d ./hello&lt;br /&gt;
&lt;br /&gt;
# Nur die .text-Sektion anzeigen&lt;br /&gt;
objdump -d -j .text ./hello&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;debugger-gdb&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Debugger (&amp;lt;code&amp;gt;gdb&amp;lt;/code&amp;gt;) ===&lt;br /&gt;
&lt;br /&gt;
Interaktives Debugging mit Assembler-Ansicht.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiele:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;# Programm starten&lt;br /&gt;
gdb ./hello&lt;br /&gt;
&lt;br /&gt;
# Disassemblieren der main-Funktion&lt;br /&gt;
(gdb) disassemble main&lt;br /&gt;
&lt;br /&gt;
# Schrittweise Ausführung (Assembler-Ebene)&lt;br /&gt;
(gdb) layout asm&lt;br /&gt;
(gdb) stepi  # Single instruction&lt;br /&gt;
(gdb) nexti  # Next instruction&lt;br /&gt;
&lt;br /&gt;
# Register anzeigen&lt;br /&gt;
(gdb) info registers&lt;br /&gt;
(gdb) print $rax&lt;br /&gt;
&lt;br /&gt;
# Speicher anzeigen&lt;br /&gt;
(gdb) x/10x $rsp  # 10 Hex-Werte ab Stack-Pointer&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;nasm-netwide-assembler&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== NASM (Netwide Assembler) ===&lt;br /&gt;
&lt;br /&gt;
Unterstützt &amp;#039;&amp;#039;&amp;#039;Intel-Syntax&amp;#039;&amp;#039;&amp;#039; und ist populär für Cross-Platform-Assembler.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Installation:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;sudo apt install nasm  # Debian/Ubuntu&lt;br /&gt;
sudo dnf install nasm  # Fedora/RHEL&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel (Intel-Syntax):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;; hello.asm&lt;br /&gt;
section .data&lt;br /&gt;
    msg db &amp;#039;Hello, NASM!&amp;#039;, 0xA&lt;br /&gt;
    len equ $ - msg&lt;br /&gt;
&lt;br /&gt;
section .text&lt;br /&gt;
    global _start&lt;br /&gt;
&lt;br /&gt;
_start:&lt;br /&gt;
    mov rax, 1      ; sys_write&lt;br /&gt;
    mov rdi, 1      ; stdout&lt;br /&gt;
    mov rsi, msg    ; buffer&lt;br /&gt;
    mov rdx, len    ; length&lt;br /&gt;
    syscall&lt;br /&gt;
    &lt;br /&gt;
    mov rax, 60     ; sys_exit&lt;br /&gt;
    xor rdi, rdi    ; status 0&lt;br /&gt;
    syscall&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Kompilieren &amp;amp;amp; Linken:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;nasm -f elf64 hello.asm -o hello.o&lt;br /&gt;
ld hello.o -o hello&lt;br /&gt;
./hello&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;computer-praktische-beispiele&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 💻 Praktische Beispiele ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;1-hello-world-in-x86-64-assembler-att-syntax&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 1. Hello World in x86-64 Assembler (AT&amp;amp;amp;T-Syntax) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;# hello.s&lt;br /&gt;
.section .data&lt;br /&gt;
msg: .ascii &amp;quot;Hello, Linux ASM!\n&amp;quot;&lt;br /&gt;
len = . - msg&lt;br /&gt;
&lt;br /&gt;
.section .text&lt;br /&gt;
.global _start&lt;br /&gt;
_start:&lt;br /&gt;
    # write(1, msg, len)&lt;br /&gt;
    mov $1, %rax          # sys_write (1)&lt;br /&gt;
    mov $1, %rdi          # fd (stdout = 1)&lt;br /&gt;
    lea msg, %rsi        # buffer address&lt;br /&gt;
    mov $len, %rdx        # length&lt;br /&gt;
    syscall&lt;br /&gt;
&lt;br /&gt;
    # exit(0)&lt;br /&gt;
    mov $60, %rax         # sys_exit (60)&lt;br /&gt;
    xor %rdi, %rdi        # status = 0&lt;br /&gt;
    syscall&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Kompilieren &amp;amp;amp; Ausführen:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;as --64 hello.s -o hello.o&lt;br /&gt;
ld hello.o -o hello&lt;br /&gt;
./hello&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;2-addition-von-zwei-zahlen&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 2. Addition von zwei Zahlen ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;# add.s&lt;br /&gt;
.section .text&lt;br /&gt;
.global _start&lt;br /&gt;
_start:&lt;br /&gt;
    mov $10, %rax   # a = 10&lt;br /&gt;
    mov $20, %rbx   # b = 20&lt;br /&gt;
    add %rbx, %rax  # rax = rax + rbx (30)&lt;br /&gt;
    &lt;br /&gt;
    # exit(30)&lt;br /&gt;
    mov $60, %rax   # sys_exit&lt;br /&gt;
    mov %rax, %rdi  # status = 30&lt;br /&gt;
    syscall&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Testen:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;as --64 add.s -o add.o&lt;br /&gt;
ld add.o -o add&lt;br /&gt;
./add&lt;br /&gt;
echo $?  # Gibt 30 aus (Exit-Status)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;3-schleife-zählen-von-1-bis-10&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 3. Schleife (Zählen von 1 bis 10) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;# loop.s&lt;br /&gt;
.section .text&lt;br /&gt;
.global _start&lt;br /&gt;
_start:&lt;br /&gt;
    mov $1, %rcx   # Zähler = 1&lt;br /&gt;
loop_start:&lt;br /&gt;
    # Hier könnte man %rcx ausgeben (für Einfachheit weggelassen)&lt;br /&gt;
    inc %rcx       # Zähler++&lt;br /&gt;
    cmp $10, %rcx  # Vergleiche mit 10&lt;br /&gt;
    jle loop_start # Springe zurück, wenn &amp;lt;= 10&lt;br /&gt;
    &lt;br /&gt;
    # exit(0)&lt;br /&gt;
    mov $60, %rax&lt;br /&gt;
    xor %rdi, %rdi&lt;br /&gt;
    syscall&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;4-inline-assembler-in-c&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 4. Inline-Assembler in C ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;// inline_asm.c&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int a = 10, b = 20, result;&lt;br /&gt;
    &lt;br /&gt;
    __asm__ volatile (&lt;br /&gt;
        &amp;quot;addl %1, %0&amp;quot;   // %0 = %0 + %1&lt;br /&gt;
        : &amp;quot;=r&amp;quot; (result) // Ausgabe: result&lt;br /&gt;
        : &amp;quot;r&amp;quot; (a), &amp;quot;0&amp;quot; (b) // Eingabe: a, b (b in %0 vorinitialisieren)&lt;br /&gt;
    );&lt;br /&gt;
    &lt;br /&gt;
    printf(&amp;quot;Result: %d\n&amp;quot;, result); // 30&lt;br /&gt;
    return 0;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Kompilieren:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;gcc inline_asm.c -o inline_asm&lt;br /&gt;
./inline_asm&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;5-inline-assembler-in-rust-nightly&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 5. Inline-Assembler in Rust (Nightly) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;rust&amp;quot;&amp;gt;// inline_asm.rs&lt;br /&gt;
fn main() {&lt;br /&gt;
    let a: u64 = 10;&lt;br /&gt;
    let b: u64 = 20;&lt;br /&gt;
    let mut result: u64;&lt;br /&gt;
    &lt;br /&gt;
    unsafe {&lt;br /&gt;
        asm!(&lt;br /&gt;
            &amp;quot;add {}, {}&amp;quot;,&lt;br /&gt;
            inout(&amp;quot;rax&amp;quot;) a =&amp;gt; result,&lt;br /&gt;
            in(&amp;quot;rbx&amp;quot;) b,&lt;br /&gt;
        );&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    println!(&amp;quot;Result: {}&amp;quot;, result); // 30&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Kompilieren (benötigt Nightly Rust):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;rustup default nightly&lt;br /&gt;
rustc inline_asm.rs -o inline_asm&lt;br /&gt;
./inline_asm&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;6-datei-lesen-mit-syscalls&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 6. Datei lesen mit Syscalls ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;# read_file.s&lt;br /&gt;
.section .data&lt;br /&gt;
filename: .ascii &amp;quot;test.txt\0&amp;quot;&lt;br /&gt;
buffer: .space 1024&lt;br /&gt;
&lt;br /&gt;
.section .text&lt;br /&gt;
.global _start&lt;br /&gt;
_start:&lt;br /&gt;
    # open(filename, O_RDONLY)&lt;br /&gt;
    mov $2, %rax          # sys_open&lt;br /&gt;
    lea filename, %rdi   # filename&lt;br /&gt;
    xor %rsi, %rsi        # flags = 0 (O_RDONLY)&lt;br /&gt;
    xor %rdx, %rdx        # mode = 0&lt;br /&gt;
    syscall&lt;br /&gt;
    &lt;br /&gt;
    mov %rax, %r8         # fd in r8 speichern&lt;br /&gt;
    &lt;br /&gt;
    # read(fd, buffer, 1024)&lt;br /&gt;
    mov $0, %rax          # sys_read&lt;br /&gt;
    mov %r8, %rdi         # fd&lt;br /&gt;
    lea buffer, %rsi      # buffer&lt;br /&gt;
    mov $1024, %rdx       # count&lt;br /&gt;
    syscall&lt;br /&gt;
    &lt;br /&gt;
    # write(1, buffer, rax)  # rax = gelesene Bytes&lt;br /&gt;
    mov $1, %rax          # sys_write&lt;br /&gt;
    mov $1, %rdi          # stdout&lt;br /&gt;
    lea buffer, %rsi      # buffer&lt;br /&gt;
    mov %rax, %rdx        # count (aus read)&lt;br /&gt;
    syscall&lt;br /&gt;
    &lt;br /&gt;
    # close(fd)&lt;br /&gt;
    mov $3, %rax          # sys_close&lt;br /&gt;
    mov %r8, %rdi         # fd&lt;br /&gt;
    syscall&lt;br /&gt;
    &lt;br /&gt;
    # exit(0)&lt;br /&gt;
    mov $60, %rax&lt;br /&gt;
    xor %rdi, %rdi&lt;br /&gt;
    syscall&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;dart-architektspezifische-hinweise&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 🎯 Architektspezifische Hinweise ==&lt;br /&gt;
&lt;br /&gt;
=== x86-64 ===&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Standard&amp;#039;&amp;#039;&amp;#039; auf modernen Linux-Systemen&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Register&amp;#039;&amp;#039;&amp;#039;: 16 allgemeine Register (&amp;lt;code&amp;gt;rax&amp;lt;/code&amp;gt;–&amp;lt;code&amp;gt;r15&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Syscall&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;syscall&amp;lt;/code&amp;gt;-Instruktion&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;ABI&amp;#039;&amp;#039;&amp;#039;: [https://refspecs.linuxfoundation.org/elf/x86_64-SysV-psABI.pdf System V AMD64 ABI]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;arm-aarch64&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== ARM (AArch64) ===&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Register&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;x0&amp;lt;/code&amp;gt;–&amp;lt;code&amp;gt;x30&amp;lt;/code&amp;gt; (64 Bit), &amp;lt;code&amp;gt;w0&amp;lt;/code&amp;gt;–&amp;lt;code&amp;gt;w30&amp;lt;/code&amp;gt; (32 Bit)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Syscall&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;svc #0&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Syscall-Nummern&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;x8&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Argumente&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;x0&amp;lt;/code&amp;gt;–&amp;lt;code&amp;gt;x5&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel (ARM64):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;// hello-arm.s&lt;br /&gt;
.data&lt;br /&gt;
msg: .ascii &amp;quot;Hello, ARM64!\n&amp;quot;&lt;br /&gt;
len = . - msg&lt;br /&gt;
&lt;br /&gt;
.text&lt;br /&gt;
.global _start&lt;br /&gt;
_start:&lt;br /&gt;
    mov x0, #1          // fd (stdout)&lt;br /&gt;
    ldr x1, =msg       // buffer&lt;br /&gt;
    ldr x2, =len       // length&lt;br /&gt;
    mov x8, #64        // sys_write (64)&lt;br /&gt;
    svc #0             // syscall&lt;br /&gt;
    &lt;br /&gt;
    mov x0, #0         // status&lt;br /&gt;
    mov x8, #93        // sys_exit (93)&lt;br /&gt;
    svc #0&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Kompilieren (Cross-Compiling):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;aarch64-linux-gnu-as hello-arm.s -o hello-arm.o&lt;br /&gt;
aarch64-linux-gnu-ld hello-arm.o -o hello-arm&lt;br /&gt;
qemu-aarch64 ./hello-arm&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;risc-v&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== RISC-V ===&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Register&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;x0&amp;lt;/code&amp;gt;–&amp;lt;code&amp;gt;x31&amp;lt;/code&amp;gt; (64 Bit bei RV64)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Syscall&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;ecall&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Syscall-Nummern&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;a7&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Argumente&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;a0&amp;lt;/code&amp;gt;–&amp;lt;code&amp;gt;a5&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel (RISC-V):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;# hello-riscv.s&lt;br /&gt;
.data&lt;br /&gt;
msg: .ascii &amp;quot;Hello, RISC-V!\n&amp;quot;&lt;br /&gt;
len = . - msg&lt;br /&gt;
&lt;br /&gt;
.text&lt;br /&gt;
.global _start&lt;br /&gt;
_start:&lt;br /&gt;
    li a7, 64          # sys_write (64)&lt;br /&gt;
    li a0, 1           # fd (stdout)&lt;br /&gt;
    la a1, msg         # buffer&lt;br /&gt;
    li a2, len         # length&lt;br /&gt;
    ecall&lt;br /&gt;
    &lt;br /&gt;
    li a7, 93          # sys_exit (93)&lt;br /&gt;
    li a0, 0           # status&lt;br /&gt;
    ecall&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Kompilieren:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;riscv64-linux-gnu-as hello-riscv.s -o hello-riscv.o&lt;br /&gt;
riscv64-linux-gnu-ld hello-riscv.o -o hello-riscv&lt;br /&gt;
qemu-riscv64 ./hello-riscv&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;mag-debugging--analyse&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 🔍 Debugging &amp;amp;amp; Analyse ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;disassemblieren-mit-objdump&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Disassemblieren mit objdump ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;# Vollständiges Disassemblieren&lt;br /&gt;
objdump -d ./programm&lt;br /&gt;
&lt;br /&gt;
# Nur eine Funktion anzeigen&lt;br /&gt;
objdump -d -j .text ./programm&lt;br /&gt;
&lt;br /&gt;
# Mit Adressen und Symbolen&lt;br /&gt;
objdump -d -S ./programm&lt;br /&gt;
&lt;br /&gt;
# ELF-Header anzeigen&lt;br /&gt;
objdump -f ./programm&lt;br /&gt;
&lt;br /&gt;
# Alle Sections anzeigen&lt;br /&gt;
objdump -h ./programm&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;gdb-für-assembler-debugging&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== GDB für Assembler-Debugging ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;# Programm starten&lt;br /&gt;
gdb ./programm&lt;br /&gt;
&lt;br /&gt;
# Breakpoint bei _start setzen&lt;br /&gt;
(gdb) break _start&lt;br /&gt;
&lt;br /&gt;
# Programm starten&lt;br /&gt;
(gdb) run&lt;br /&gt;
&lt;br /&gt;
# Assembler-Ansicht aktivieren&lt;br /&gt;
(gdb) layout asm&lt;br /&gt;
&lt;br /&gt;
# Register anzeigen&lt;br /&gt;
(gdb) info registers&lt;br /&gt;
(gdb) info all-registers&lt;br /&gt;
&lt;br /&gt;
# Speicher anzeigen&lt;br /&gt;
(gdb) x/10i $rip  # 10 Instruktionen ab Instruction Pointer&lt;br /&gt;
(gdb) x/10x $rsp  # 10 Hex-Werte ab Stack-Pointer&lt;br /&gt;
&lt;br /&gt;
# Schrittweise ausführen&lt;br /&gt;
(gdb) stepi   # Einzelschritt (in Funktion)&lt;br /&gt;
(gdb) nexti   # Nächste Instruktion (ohne in Funktion)&lt;br /&gt;
(gdb) continue # Weiter bis zum nächsten Breakpoint&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;radare2-alternative-zu-gdb&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Radare2 (Alternative zu GDB) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;# Installieren&lt;br /&gt;
sudo apt install radare2&lt;br /&gt;
&lt;br /&gt;
# Programm analysieren&lt;br /&gt;
r2 -A ./programm&lt;br /&gt;
&lt;br /&gt;
# Assembler anzeigen&lt;br /&gt;
[0x00000000]&amp;gt; pd 20  # 20 Instruktionen anzeigen&lt;br /&gt;
&lt;br /&gt;
# Breakpoint setzen und ausführen&lt;br /&gt;
[0x00000000]&amp;gt; db _start&lt;br /&gt;
[0x00000000]&amp;gt; dc&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;strace--system-calls-beobachten&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== strace – System Calls beobachten ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;# Alle System Calls eines Programms anzeigen&lt;br /&gt;
strace ./programm&lt;br /&gt;
&lt;br /&gt;
# Nur bestimmte Syscalls anzeigen&lt;br /&gt;
strace -e write ./programm&lt;br /&gt;
&lt;br /&gt;
# Statistik über Syscalls&lt;br /&gt;
strace -c ./programm&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;books-lernressourcen&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 📚 Lernressourcen ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;bücher&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Bücher ===&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[https://savannah.gnu.org/projects/pgubook/ Programming from the Ground Up]&amp;#039;&amp;#039;&amp;#039; – Kostenloses x86-Assembler-Buch&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[https://www.amazon.com/Assembly-Language-x86-Processors-7th/dp/013407226X Assembly Language for x86 Processors]&amp;#039;&amp;#039;&amp;#039; – Kip R. Irvine&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[https://www.amazon.com/Art-Assembly-Language-Randy-Hyde/dp/1886411972 The Art of Assembly Language]&amp;#039;&amp;#039;&amp;#039; – Randy Hyde&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;online-tutorials&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Online-Tutorials ===&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[https://wiki.osdev.org/x86_Assembly OSDev Wiki – x86 Assembly]&amp;#039;&amp;#039;&amp;#039; – OS-Entwicklung mit ASM&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[https://www.tutorialspoint.com/assembly_programming/ ASM Tutorial (TutorialsPoint)]&amp;#039;&amp;#039;&amp;#039; – Grundlagen&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[https://www.nasm.us/docs.php NASM Documentation]&amp;#039;&amp;#039;&amp;#039; – Offizielle NASM-Doks&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[https://filippo.io/linux-syscall-table/ Linux Syscall Reference]&amp;#039;&amp;#039;&amp;#039; – Syscall-Tabelle&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;videos&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Videos ===&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[https://www.youtube.com/playlist?list=PLHMOxMJQYUDy0xQ6YY7XZV78hc0xq7ZQZ LiveOverflow – x86 Assembly]&amp;#039;&amp;#039;&amp;#039; – Security &amp;amp;amp; ASM&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[https://computationstructures.org/ MIT 6.004: Computation Structures]&amp;#039;&amp;#039;&amp;#039; – Computer-Architektur&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[https://www.youtube.com/watch?v=75gBxQdYjYI The Primeagen – Learning Assembly]&amp;#039;&amp;#039;&amp;#039; – Praktische Einführung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;tools&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Tools ===&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[https://godbolt.org/ Godbolt Compiler Explorer]&amp;#039;&amp;#039;&amp;#039; – C/C++/Rust in ASM umwandeln&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[https://godbolt.org/ Compiler Explorer (ARM/RISC-V)]&amp;#039;&amp;#039;&amp;#039; – Mehrere Architekturen&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[http://www.jbeale.com/asm/ Online Assembler (Jbeale)]&amp;#039;&amp;#039;&amp;#039; – Einfacher Online-Assembler&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;dart-best-practices&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 🎯 Best Practices ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;1-register-richtig-nutzen&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 1. Register richtig nutzen ===&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;rax&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039;: Rückgabewert von Funktionen/Syscalls&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;rsp&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039;: Stack-Pointer (nie direkt manipulieren, außer in Prolog/Epilog)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;rbp&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039;: Base-Pointer (für Stack-Frames)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;rdi&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rsi&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rdx&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rcx&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;r8&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;r9&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039;: Funktionsargumente (x86-64 ABI)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Kalibrieren&amp;#039;&amp;#039;&amp;#039;: Nach Funktionsaufrufen Register sichern, die ändert werden&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;2-stack-frames&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 2. Stack-Frames ===&lt;br /&gt;
&lt;br /&gt;
Ein typischer &amp;#039;&amp;#039;&amp;#039;Funktionsprolog&amp;#039;&amp;#039;&amp;#039; (x86-64):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;push %rbp        # Alten Base-Pointer sichern&lt;br /&gt;
mov %rsp, %rbp   # Neuen Base-Pointer setzen&lt;br /&gt;
sub $16, %rsp    # Platz für lokale Variablen&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Funktionsepilog:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;mov %rbp, %rsp   # Base-Pointer wiederherstellen&lt;br /&gt;
pop %rbp        # Alten Base-Pointer laden&lt;br /&gt;
ret             # Zurückspringen&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;3-syscalls-sicher-aufrufen&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 3. Syscalls sicher aufrufen ===&lt;br /&gt;
&lt;br /&gt;
* Immer &amp;#039;&amp;#039;&amp;#039;Register vor Syscalls sichern&amp;#039;&amp;#039;&amp;#039;, die verändert werden&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;rax&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;rdi&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;rsi&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;rdx&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; werden oft überschrieben&lt;br /&gt;
* Beispiel für sicheres Syscall:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;mov %rax, %r10   # rax sichern&lt;br /&gt;
mov $1, %rax     # sys_write&lt;br /&gt;
mov $1, %rdi     # stdout&lt;br /&gt;
mov %r10, %rsi   # buffer (aus rax)&lt;br /&gt;
mov $10, %rdx    # length&lt;br /&gt;
syscall&lt;br /&gt;
mov %r10, %rax   # rax wiederherstellen&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;4-fehlerbehandlung&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 4. Fehlerbehandlung ===&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Syscall-Fehler&amp;#039;&amp;#039;&amp;#039;: Negativer Rückgabewert in &amp;lt;code&amp;gt;rax&amp;lt;/code&amp;gt; (errno in &amp;lt;code&amp;gt;-rax&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Fehler prüfen:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;syscall&lt;br /&gt;
cmp $0, %rax&lt;br /&gt;
jl error_handler  # Springe wenn rax &amp;lt; 0 (Fehler)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;5-performance-tipps&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 5. Performance-Tipps ===&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;SIMD nutzen&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;mm0&amp;lt;/code&amp;gt;–&amp;lt;code&amp;gt;mm7&amp;lt;/code&amp;gt; (MMX), &amp;lt;code&amp;gt;xmm0&amp;lt;/code&amp;gt;–&amp;lt;code&amp;gt;xmm15&amp;lt;/code&amp;gt; (SSE), &amp;lt;code&amp;gt;ymm0&amp;lt;/code&amp;gt;–&amp;lt;code&amp;gt;ymm15&amp;lt;/code&amp;gt; (AVX)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Cache-optimieren&amp;#039;&amp;#039;&amp;#039;: Daten nah beieinander speichern&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Branch Prediction&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;cmov&amp;lt;/code&amp;gt; (conditional move) statt &amp;lt;code&amp;gt;jmp&amp;lt;/code&amp;gt; für einfache Bedingungen&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Inline&amp;#039;&amp;#039;&amp;#039;: Kritische Code-Pfade in ASM schreiben&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;link-verwandte-themen&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 🔗 Verwandte Themen ==&lt;br /&gt;
&lt;br /&gt;
* [[Entwicklung / Systemprogrammierung / Compiler|Compiler]] – Wie Assembler-Code generiert wird&lt;br /&gt;
* [[Entwicklung / Systemprogrammierung / Rust &amp;amp; C/C++ / Rust, C &amp;amp; C++ Integration|Rust, C++ &amp;amp;amp; C Integration]] – Inline-Assembler in Hochsprachen&lt;br /&gt;
* [[Entwicklung / Systemprogrammierung / Linux / Linux-Systemprogrammierung|Linux-Systemprogrammierung]] – Syscalls und Kernel-Interaktion&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Letzte Aktualisierung: {{ git_revision_date_localized() }}&amp;#039;&amp;#039;&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>imported&gt;Thorsten Klöhn</name></author>
	</entry>
</feed>