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 valeurs de la mémoire dans des registres. Mais parfois, vous ne voulez pas la valeur. Vous voulez l’adresse elle-même.
LEA signifie Load Effective Address. Il calcule une adresse mémoire et place cette adresse dans un registre, sans accéder à la mémoire.
Syntaxe :
lea register, [address]MOV contre LEA :
| Instruction | Ce qu’elle fait |
|---|---|
mov al, [number] | Va en mémoire, récupère la valeur contenue à l’intérieur et la place dans al |
lea rsi, [number] | Ne va PAS en mémoire. Calcule l’adresse de number et la place dans rsi |
Imaginez-le comme ceci :
mov= ouvrez la boîte et prenez ce qui se trouve à l’intérieurlea= notez le numéro de la boîte (l’adresse) 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 l’emplacement mémoire à une fonction, vous avez besoin de l’adresse, et non de la valeur. L’appel système write (que vous apprendrez au chapitre 5) attend une adresse 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