Menu
Coddy logo textTech

LEA - Adresse laden

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

Bisher haben Sie mov verwendet, um Werte aus dem Speicher in Register zu laden. Aber manchmal wollen Sie nicht den Wert – Sie wollen die Adresse selbst.

LEA steht für Load Effective Address. Es berechnet eine Speicheradresse und schreibt diese Adresse in ein Register, ohne auf den Speicher zuzugreifen.

Syntax:

lea register, [address]

MOV vs LEA:

BefehlFunktionsweise
mov al, [number]Greift auf den Speicher zu, holt den darin enthaltenen Wert und schreibt ihn in al
lea rsi, [number]Greift NICHT auf den Speicher zu. Berechnet die Adresse von number und schreibt sie in rsi

Stellen Sie es sich so vor:

  • mov = öffne die Schachtel und nimm heraus, was sich darin befindet
  • lea = schreibe die Schachtelnummer (Adresse) auf ein Stück Papier

Beispiel:

number db 42        ; Der Wert 42 ist an einer Adresse gespeichert

mov al, [number]    ; al = 42 (der Wert)
lea rsi, [number]   ; rsi = Adresse von number (z. B. 0x402000)

Warum braucht man LEA?

In Assembler benötigen Sie die Adresse und nicht den Wert, wenn Sie einen String ausgeben oder einen Speicherort an eine Funktion übergeben möchten. Der write-Syscall (den Sie in Kapitel 5 kennenlernen werden) erwartet eine Adresse in rsi.

Was LEA tun kann (über einfache Adressen hinaus):

LEA kann auch grundlegende Berechnungen mit Adressen durchführen. Zum Beispiel:

lea rsi, [number + 5]   ; rsi = Adresse von number + 5 Bytes

Dies ist nützlich für die Arbeit mit Arrays und Datenstrukturen.

challenge icon

Aufgabe

Schreiben Sie eine Zeile Assembly-Code, um die Adresse von message in das rsi-Register zu laden.

Probier es selbst

section .data
    msg_prefix db 'message = '
    prefix_len equ $ - msg_prefix

section .text
    global _start

_start:
    ; Die lea-Anweisung des Schülers wird zuerst ausgeführt
    ; rsi sollte nun die Adresse der Nachricht enthalten
    
    ; Präfix drucken
    mov rax, 1
    mov rdi, 1
    mov rsi, msg_prefix
    mov rdx, prefix_len
    syscall
    
    %include "solution.asm"
    
    ; Den String mit der vom Schüler geladenen Adresse drucken
    mov rax, 1
    mov rdi, 1
    ; rsi enthält bereits die Adresse (aus dem Code des Schülers)
    mov rdx, 6                    ; "Hello" + Zeilenumbruch = 6 Bytes
    syscall
    
    ; Beenden
    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