Menu
CoddyTech

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 msg

Was 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
    syscall
challenge icon

Aufgabe

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
    syscall
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Grundlagen

Übe selbstständig: Assembly-Playground