Menu
Coddy logo textTech

LEA – załaduj adres

Część sekcji Podstawy ścieżki Assembly w Coddy. Lekcja 19 z 45.

Do tej pory używałeś mov, aby ładować wartości z pamięci do rejestrów. Czasami jednak nie chcesz wartości. Chcesz samego adresu.

LEA to skrót od Load Effective Address. Oblicza adres pamięci i umieszcza go w rejestrze, nie odwołując się do pamięci.

Składnia:

lea register, [address]

MOV vs LEA:

InstrukcjaCo robi
mov al, [number]Przechodzi do pamięci, pobiera znajdującą się tam wartość i umieszcza ją w al
lea rsi, [number]NIE przechodzi do pamięci. Oblicza adres zmiennej number i umieszcza go w rsi

Wyobraź sobie to tak:

  • mov = otwórz pudełko i weź to, co jest w środku
  • lea = zapisz numer pudełka (adres) na kartce

Przykład:

number db 42        ; Wartość 42 jest przechowywana pod pewnym adresem

mov al, [number]    ; al = 42 (wartość)
lea rsi, [number]   ; rsi = adres number (np. 0x402000)

Dlaczego potrzebujesz LEA?

W asemblerze, gdy chcesz wyświetlić ciąg znaków lub przekazać funkcji adres pamięci, potrzebujesz adresu, a nie wartości. Wywołanie systemowe write (którego nauczysz się w rozdziale 5) oczekuje adresu w rsi.

Co potrafi LEA (poza prostymi adresami):

LEA potrafi także wykonywać podstawowe obliczenia matematyczne na adresach. Na przykład:

lea rsi, [number + 5]   ; rsi = adres number + 5 bajtów

To przydatne podczas pracy z tablicami i strukturami danych.

challenge icon

Wyzwanie

Napisz jedną linię asemblera, która załaduje adres message do rejestru rsi.

Spróbuj swoich sił

section .data
    msg_prefix db 'message = '
    prefix_len equ $ - msg_prefix

section .text
    global _start

_start:
    ; Instrukcja lea napisana przez ucznia wykonuje się jako pierwsza
    ; rsi powinien teraz zawierać adres message
    
    ; Wypisz prefiks
    mov rax, 1
    mov rdi, 1
    mov rsi, msg_prefix
    mov rdx, prefix_len
    syscall
    
    %include "solution.asm"
    
    ; Wypisz ciąg znaków, używając adresu załadowanego przez ucznia
    mov rax, 1
    mov rdi, 1
    ; rsi zawiera już adres (pochodzący z kodu ucznia)
    mov rdx, 6                    ; "Hello" + znak nowego wiersza = 6 bajtów
    syscall
    
    ; Zakończ program
    mov rax, 60
    mov rdi, 0
    syscall
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Podstawy

Poćwicz samodzielnie: Edytor online Assembly