Der .data-Abschnitt
Teil des Abschnitts Grundlagen der Assembly-Journey von Coddy. Lektion 23 von 45.
In Kapitel 2 hast du Werte aus dem Speicher geladen und Werte im Speicher abgelegt. Aber woher kam dieser Speicher? Wer hat num1, num2 und result erstellt?
Die Antwort ist der .data-Abschnitt. Hier erstellst du deine eigenen Daten im Speicher.
Was ist der .data-Abschnitt?
Der Abschnitt .data ist ein Teil deines Assemblerprogramms, in dem du Daten definierst, die im Speicher abgelegt werden, bevor dein Programm ausgeführt wird.
Syntax:
section .data
; Hier kommen deine Datendefinitionen hinWarum du es brauchst:
| Ohne .data-Abschnitt | Mit .data-Abschnitt |
|---|---|
| Du hast keine Daten, mit denen du arbeiten kannst | Du kannst Zahlen, Zeichenketten und Variablen erstellen |
| Speicheradressen sind unbekannt | Du kannst Labels wie myNumber oder message verwenden |
| Du kannst deinen Code nicht testen | Du kannst Daten laden und speichern, die du erstellt hast |
Ein einfaches Beispiel:
section .data
age db 25 ; Erstelle ein Byte namens "age" mit dem Wert 25
price dw 1000 ; Erstelle ein Word namens "price" mit dem Wert 1000
name db 'Bob' ; Erstelle eine Zeichenkette namens "name" mit den Buchstaben B, o, bWo es in deinen Dateien hingehört:
Denk an das Zwei-Dateien-Muster aus Kapitel 0:
| Datei | Inhalt |
|---|---|
data.asm | section .data mit deinen Datendefinitionen |
main.asm | %include "data.asm" gefolgt von section .text mit deinem Code |
Was passiert, wenn dein Programm ausgeführt wird:
- Das Betriebssystem lädt dein Programm in den Speicher
- Es liest den Abschnitt
.dataund platziert deine Daten an bestimmten Speicheradressen
- Deine Labels (
age,price,name) werden zu Adressen - Dein Code kann jetzt mit
[age],[price],[name]auf diese Adressen zugreifen
Wichtige Regeln:
| Regel | Erklärung |
|---|---|
| Halte deine Daten zusammen | Du könntest section .data mehr als einmal öffnen (der Assembler fügt die Teile zusammen), aber ein Abschnitt in data.asm ist leichter zu lesen |
| Labels müssen eindeutig sein | Du kannst nicht zwei age-Labels haben |
| Daten werden erstellt, bevor dein Code ausgeführt wird | Sie sind einsatzbereit, wenn _start beginnt |
In den nächsten Lektionen lernst du, wie du verschiedene Datentypen mit db, dw, dd und dq definierst.
Aufgabe
Schreibe den Code in der Datei data.asm, um:
- den Abschnitt
.datazu erstellen - ein Byte namens
countmit dem Wert 5 zu erstellen
Probier es selbst
%include "data.asm"
section .text
global _start
_start:
; Lade den Wert aus count in al
mov al, [count]
; Speichere ihn für die Ausgabe
mov r12, rax
; Wandle ihn in ASCII um und gib ihn aus (nur 0-9)
add al, 48
mov [digit], al
mov rax, 1
mov rdi, 1
mov rsi, digit
mov rdx, 1
syscall
; Beende das Programm
mov rax, 60
mov rdi, 0
syscall
section .bss
digit resb 1Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Grundlagen
1Die Maschine
Was ist eine CPUSpeicherRegister vs. SpeicherWie Befehle funktionierenZwei-Dateien-MusterDie x86-64 ArchitekturÜbe selbstständig: Assembly-Playground