Co robi zestawienie LEAL?


Jestem trochę zdezorientowany różnicą między nimi.
leal -4(%ebp), %eax

i
movl -4(%ebp), %eax

Czy ktoś może mi to wytłumaczyć?
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

LEA
http://pdos.csail.mit.edu/6.82 ... A.htm
(załaduj efektywny adres) po prostu oblicza

adres

operand, ale w rzeczywistości go nie wyłuskuje. W większości przypadków po prostu wykonuje obliczenia, takie jak połączone mnożenie i dodawanie, na przykład w celu indeksowania tablicy.
W tym przypadku wykonuje proste odejmowanie liczbowe:
leal -4 (% ebp),% eax
po prostu przypisuje
% eax
do
% ebp - 4
... Jest to odpowiednik pojedynczej instrukcji
sub
, z tą różnicą, że
sub
wymaga, aby miejsce docelowe było takie samo jak jedno ze źródeł.
Natomiast
movl
uzyskuje dostęp do lokalizacji pamięci w
% ebp - 4
i przechowuje tę wartość w
% eax
.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jeśli chcesz spojrzeć na to z perspektywy innego języka programowania, to:
int var;
[ ... ]
func (var, &var);

obliczany jest następujący zestaw kodu (Linux x86_64):
[ ... ]
4: 8b 7c 24 0c mov 0xc(%rsp),%edi
8: 48 8d 74 24 0c lea 0xc(%rsp),%rsi
d: e8 xx xx xx xx callq ... <func>
[ ... ]
Ponieważ
% rdi
/
% rsi
to 1
<sup>
</sup>
/ 2
<sup>
</sup>
argumenty, możesz zobaczyć, że
lea ...
pobiera

adres
zmienna
& amp; var
i
mov ...
ładuje/przechowuje

wartość
var
jest taki sam.
To znaczy. w asemblerze użycie
lea
zamiast
mov
jest podobne do używania operatora address-of
& amp;
w C/C ++, zamiast samą wartość zmiennej.
lea
ma o wiele więcej zastosowań niż to, ale wyraźnie zapytałeś o różnicę między nimi.
Aby zilustrować:
mov
z operandem pamięci zawsze uzyskuje dostęp do pamięci (ładuje lub zapisuje), podczas gdy operand pamięci do
lea
jest po prostu obsługiwany jako

arytmetyka wskaźnika

- to znaczy adres jest obliczany i rozstrzygany, ale w samej instrukcji nie ma dostępu do pamięci. Tych dwóch:
lea 1234(%eax, %ebx, 8), %ecx
movl (%ecx), ecx

wynik jest taki sam jak:
movl 1234(%eax, %ebx, 8), %ecx

podczas gdy następujące:
leal (%eax, %eax, 4), %eax

mnoży wartość w
% eax
przez pięć.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Odpowiednik
LEA
w składni Intela, załaduj efektywny adres (długi?).
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Zarówno LEA, jak i MOV mogą ładować rejestr z przesunięciem do a
na przykład zmienna.
MOV może również przesłać zawartość komórki pamięci do rejestru LEA
Nie mogę.
LEA & amp; MOV może obliczyć "efektywne przesunięcia", które można wykorzystać do tego.
matematyka jest znacznie wydajniejsza

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się