LEA - Charger l'adresse
Fait partie de la section Fondamentaux du Journey Assembly de Coddy. Leçon 19 sur 45.
Jusqu’à présent, vous avez utilisé mov pour charger des values de la mémoire dans des registres. Mais parfois, vous ne voulez pas la valeur. Vous voulez l’address elle-même.
LEA signifie Load Effective Address. Il calcule une memory address et place cette address dans un register, sans accéder à la mémoire.
Syntaxe :
lea register, [address]MOV vs LEA :
| instruction | Ce qu’elle fait |
|---|---|
mov al, [number] | Accède à la mémoire, récupère la valeur qu’elle contient et la place dans al |
lea rsi, [number] | Ne va PAS en mémoire. Calcule l’address de number et le place dans rsi |
Imagine-le ainsi :
mov= ouvre la boîte et prends ce qu’il y a à l’intérieurlea= écris le numéro de la boîte (address) sur un morceau de papier
Exemple :
number db 42 ; La valeur 42 est stockée à une certaine adresse
mov al, [number] ; al = 42 (la valeur)
lea rsi, [number] ; rsi = adresse de number (p. ex., 0x402000)Pourquoi avez-vous besoin de LEA ?
En assembleur, lorsque vous voulez afficher une chaîne ou transmettre un emplacement mémoire à une fonction, vous avez besoin de l’address, et non de la valeur. L’appel système write (que vous apprendrez au chapitre 5) attend une address dans rsi.
Ce que LEA peut faire (au-delà des simples adresses) :
LEA peut également effectuer des calculs de base avec des adresses. Par exemple :
lea rsi, [number + 5] ; rsi = adresse de number + 5 octetsCela est utile pour travailler avec des tableaux et des structures de données.
Défi
Écrivez une ligne d’assembleur pour charger l’adresse de message dans le registre rsi.
Essayez vous-même
section .data
msg_prefix db 'message = '
prefix_len equ $ - msg_prefix
section .text
global _start
_start:
; L'instruction lea de l'étudiant s'exécute en premier
; rsi devrait maintenant contenir l'adresse de message
; Afficher le préfixe
mov rax, 1
mov rdi, 1
mov rsi, msg_prefix
mov rdx, prefix_len
syscall
%include "solution.asm"
; Afficher la chaîne en utilisant l'adresse chargée par l'étudiant
mov rax, 1
mov rdi, 1
; rsi a déjà l'adresse (du code de l'étudiant)
mov rdx, 6 ; "Hello" + newline = 6 octets
syscall
; Quitter
mov rax, 60
mov rdi, 0
syscallCette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Fondamentaux
1La Machine
Qu'est-ce qu'un CPULa mémoireRegistres vs MémoireFonctionnement des instructionsLe modèle à deux fichiersL'architecture x86-64Entraînez-vous par vous-même : Playground Assembly