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