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:
| Anweisung | Was 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 istlea= 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 BytesDies ist nützlich für die Arbeit mit Arrays und Datenstrukturen.
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
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