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 depuis 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. Elle calcule une adresse mémoire et place cette adresse dans un registre, 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 à l'intérieur, la place dans al |
lea rsi, [number] | N'accède PAS à la mémoire. Calcule l'adresse de number et la place dans rsi |
Voyez les choses ainsi :
mov= ouvrez la boîte et prenez ce qu'il y a à 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 (par ex., 0x402000)Pourquoi avez-vous besoin de LEA ?
En assembleur, lorsque vous voulez afficher une chaîne de caractères ou passer un emplacement mémoire à une fonction, vous avez besoin de l'adresse, pas 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 adresses simples) :
LEA peut également effectuer des calculs mathématiques de base avec des adresses. Par exemple :
lea rsi, [number + 5] ; rsi = adresse de number + 5 octetsCeci 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 contient déjà l'adresse (provenant du code de l'étudiant)
mov rdx, 6 ; "Hello" + saut de ligne = 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-64