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), noch mitteilen, was es ausgeben soll. Dazu übergibst du die Adresse der Zeichenfolge im Speicher.
Das Register für die Pufferadresse ist rsi.
Was ist ein Puffer?
Ein Puffer ist einfach ein Speicherblock, der Daten enthält. In unserem Fall ist der Puffer die Zeichenfolge, die wir ausgeben möchten.
Warum die Adresse und nicht der Wert selbst?
Der Systemaufruf write muss wissen, wo die Zeichenfolge im Speicher beginnt. Er liest Bytes ab dieser Adresse, bis er die Länge erreicht, die du in rdx angibst. Du übergibst dem Systemaufruf nicht die eigentlichen Zeichen. Du übergibst ihren Speicherort.
Beispiel:
section .data
msg db 'Hello', 0x0a
section .text
mov rsi, msg ; rsi enthält die Adresse von msgWas msg wirklich ist:
msg ist ein Label. Der Assembler ersetzt es durch eine Zahl: die Speicheradresse, an der die Zeichenfolge 'Hello' gespeichert ist. Wenn du mov rsi, msg schreibst, legst du diese Adressnummer in rsi ab.
Was passiert, wenn du die Adresse vergisst?
Wenn du rsi nicht setzt, enthält das Register beliebige Daten, die sich zuvor darin befanden. Das Betriebssystem versucht, von einer zufälligen Speicheradresse zu lesen, was wahrscheinlich zu einem Segmentierungsfehler (Absturz) führt.
Vollständiges Beispiel mit dem write-Systemaufruf:
section .data
msg db 'Hello', 0x0a
len equ $ - msg
section .text
mov rax, 1 ; write-Systemaufruf
mov rdi, 1 ; stdout
mov rsi, msg ; Adresse der Zeichenkette
mov rdx, len ; Anzahl der Bytes
syscallAufgabe
Du erhältst eine Zeichenkette namens greeting mit dem Wert 'Hi', gefolgt von einem Zeilenumbruch. Schreibe die Codezeile, die die Adresse 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 enthält bereits die Adresse (aus dem Code des Lernenden)
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