Menu
Coddy logo textTech

LEA - Adresse laden

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

Bisher hast du mov verwendet, um Werte aus dem Speicher in Register zu laden. Aber manchmal möchtest du nicht den Wert. Du möchtest die Adresse selbst.

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

Syntax:

lea register, [address]

MOV vs LEA:

AnweisungWas sie tut
mov al, [number]Geht zum Speicher, ruft den darin enthaltenen Wert ab und legt ihn in al ab
lea rsi, [number]Greift NICHT auf den Speicher zu. Berechnet die Adresse von number und legt sie in rsi ab

Stell es dir so vor:

  • mov = Öffne die Box und nimm, was darin ist
  • lea = Schreibe die Boxnummer (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 brauchst du LEA?

In Assembler benötigst du die Adresse und nicht den Wert, wenn du eine Zeichenkette ausgeben oder eine Speicheradresse an eine Funktion übergeben möchtest. Der write-Systemaufruf (den du in Kapitel 5 kennenlernen wirst) erwartet eine Adresse in rsi.

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

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

Schreibe eine Zeile Assembly, 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 Studenten wird zuerst ausgeführt
    ; rsi sollte jetzt die Adresse von message enthalten
    
    ; Präfix ausgeben
    mov rax, 1
    mov rdi, 1
    mov rsi, msg_prefix
    mov rdx, prefix_len
    syscall
    
    %include "solution.asm"
    
    ; Die Zeichenkette mit der vom Studenten geladenen Adresse ausgeben
    mov rax, 1
    mov rdi, 1
    ; rsi enthält bereits die Adresse (aus dem Code des Studenten)
    mov rdx, 6                    ; "Hello" + newline = 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

Übe selbstständig: Assembly-Playground