Pufferadresse (rsi)
Teil des Abschnitts Grundlagen der Assembly-Journey von Coddy. Lektion 37 von 45.
Beim write-Systemaufruf musst du dem Betriebssystem, nachdem du ihm mitgeteilt hast, wohin es die Ausgabe senden soll (Dateideskriptor in rdi), mitteilen, was es ausgeben soll. Dazu übergibst du die address des Strings im Speicher.
Das Register für die Pufferadresse ist rsi.
Was ist ein Puffer?
Ein Puffer ist einfach ein Speicherblock, der data enthält. In unserem Fall ist der Puffer die Zeichenkette, die wir ausgeben möchten.
Warum address und nicht der Wert selbst?
Der write-Systemaufruf muss wissen, wo der string im Speicher beginnt. Er liest bytes ab dieser address, bis er die Länge erreicht, die du in rdx angibst. Du sendest nicht die tatsächlichen Zeichen an den Systemaufruf. Du sendest ihren Speicherort.
Beispiel:
section .data
msg db 'Hello', 0x0a
section .text
mov rsi, msg ; rsi hält die Adresse von msgWas <strong>msg</strong> wirklich ist:
msg ist ein Label. Der Assembler ersetzt es durch eine Zahl: die Speicheradresse, an der die Zeichenkette 'Hello' gespeichert ist. Wenn du mov rsi, msg schreibst, setzt du diese Adresszahl in rsi ein.
Was passiert, wenn du die Adresse vergisst?
Wenn du rsi nicht setzt, enthält das Register den zufälligen Inhalt, der zuvor darin gespeichert war. Das Betriebssystem versucht, von einer zufälligen Speicheradresse zu lesen, was wahrscheinlich einen Segmentation Fault (Absturz) verursacht.
Vollständiges Beispiel mit write-Systemaufruf:
section .data
msg db 'Hello', 0x0a
len equ $ - msg
section .text
mov rax, 1 ; write-Syscall
mov rdi, 1 ; stdout
mov rsi, msg ; Adresse des Strings
mov rdx, len ; Anzahl der Bytes
syscallAufgabe
Du erhältst einen string namens greeting mit dem Wert 'Hi', gefolgt von einem Zeilenumbruch. Schreibe die Codezeile, die die address von greeting in rsi lädt.
Schreibe nur die mov-Anweisung für rsi.
Probier es selbst
section .text
global _start
_start:
%include "solution.asm"
mov rax, 1
mov rdi, 1
; rsi hat die Adresse bereits (aus dem Code des Studenten)
mov rdx, greetingLen
syscall
mov rax, 60
mov rdi, 0
syscallDiese 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