Menu
Coddy logo textTech

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 :

instructionCe 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érieur
  • lea = é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 octets

Cela est utile pour travailler avec des tableaux et des structures de données.

challenge icon

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
    syscall
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Fondamentaux

Entraînez-vous par vous-même : Playground Assembly