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:
| Instrukcja | Co 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 środkulea= 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ówTo przydatne podczas pracy z tablicami i strukturami danych.
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
syscallTa lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Podstawy
1Maszyna
Czym jest CPUPamięćRejestry a pamięćJak działają instrukcjeWzorzec dwóch plikówArchitektura x86-642Systemy liczbowe
Dlaczego system binarny?Liczby binarneZamiana z systemu dziesiętnego na binarnyDlaczego system szesnastkowy?Zamiana z systemu szesnastkowego na dziesiętnyZamiana z systemu dziesiętnego na szesnastkowyASCII i system szesnastkowy5Wywołanie systemowe zakończenia
Czym jest syscall?Wywołanie systemowe zakończenia (60)Kody zakończeniaPodsumowanie: prawidłowe zakończeniePoćwicz samodzielnie: Edytor online Assembly