Menu
Coddy logo textTech

Pufferadresse (rsi)

Teil des Abschnitts Grundlagen der Assembly-Journey von Coddy — Lektion 37 von 45.

Beim write-Syscall müssen Sie dem Betriebssystem, nachdem Sie ihm mitgeteilt haben, wohin die Ausgabe gesendet werden soll (Dateideskriptor in rdi), mitteilen, was gedruckt werden soll. Dies geschieht durch Übergabe der Adresse des Strings 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 drucken möchten.

Warum die Adresse und nicht der Wert selbst?

Der write-Syscall muss wissen, wo der String im Speicher beginnt. Er liest Bytes von dieser Adresse, bis er die Länge erreicht, die Sie in rdx angeben. Sie senden nicht die tatsächlichen Zeichen an den Syscall – Sie senden deren Speicherort.

Beispiel:

section .data
    msg db 'Hello', 0x0a

section .text
    mov rsi, msg        ; rsi enthält die Adresse von msg

Was <strong>msg</strong> wirklich ist:

msg ist ein Label. Der Assembler ersetzt es durch eine Zahl — die Speicheradresse, an der der String 'Hello' gespeichert ist. Wenn Sie mov rsi, msg schreiben, kopieren Sie diese Adressnummer in rsi.

Was passiert, wenn Sie die Adresse vergessen?

Wenn Sie rsi nicht setzen, enthält das Register den Datenmüll, der zuvor dort vorhanden war. Das Betriebssystem wird versuchen, von einer zufälligen Speicheradresse zu lesen, was wahrscheinlich zu einem Speicherzugriffsfehler (Segmentation Fault/Absturz) führen wird.

Vollständiges Beispiel mit dem write-Syscall:

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

Aufgabe

Dir ist ein String namens greeting mit dem Wert 'Hi' gefolgt von einem Zeilenumbruch gegeben. 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 hat bereits die Adresse (aus dem Code des Studenten)
    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