nasm, pobranie adresu pamięci

0

Witam,
Przerabiam książkę, w której mam następujący kod assemblera:

lea ax, data
data db 'ABCDE'

odwołując się po nazwie tj. "data" powinienem dostać adres zerowego elementu, czyli elementu 'A'. Korzystam z nasm'a i wywala mi on błąd (dla instrukcji lea)

error: invalid combination of opcode and operands

Działa za to taka instrukcja

lea ax, [data]

Dlaczego należy tutaj użyć nawiasów kwadratowych ? Dlaczego w książce mam podane bez nawiasów (domyślam się że to dla innego wersji nasma, ale dlaczego jest taka różnica zapisów) ? Dzięki za pomoc.

0

Instrukcja LEA oczekuje adresu/odwołania do pamięci, dlatego potrzebne są te nawiasy kwadratowe.

lea eax, [ebx+4*eax]

Pomnoży eax przez 4 i doda do tego ebx, a wynik przypisze do rejestru eax:
(pseudokod): eax = ebx+4*eax

Podczas gdy:

mov eax, dword [ebx+4*eax]

Pomnoży eax przez 4 i doda do niego ebx, po czym do rejestru przypisze wartość dword znajdującą się pod tym adresem.
(pseudokod-pascal-style): eax = PDWord(ebx+4*eax)^

0
Patryk27 napisał(a):

Instrukcja LEA oczekuje adresu/odwołania do pamięci, dlatego potrzebne są te nawiasy kwadratowe.

lea eax, [ebx+4*eax]

Pomnoży eax przez 4 i doda do tego ebx, a wynik przypisze do rejestru eax:
(pseudokod): eax = ebx+4*eax

Podczas gdy:

mov eax, dword [ebx+4*eax]

Pomnoży eax przez 4 i doda do niego ebx, po czym do rejestru przypisze wartość dword znajdującą się pod tym adresem.
(pseudokod-pascal-style): eax = PDWord(ebx+4*eax)^

Tak, ja rozumiem o co Ci chodzi, ale moje pytanie dotyczyło dlaczego w książce instrukcja została użyta bez nawiasów w drugim argumencie instrukcji ?

0
  1. czy twoja książka jest konkretnie do NASM-a? NASM ma trochę inną składnię niż inne asemblery dla x86, ale za to bardziej konsekwentną.
    data oznacza zawsze adres zmiennej „data”.
    [data] oznacza zawsze wartość mieszczącą się pod adresem data.

  2. instrukcja LEA nie wykonuje żadnej magii, jak to czasami sugerują. wykonuje aż i tylko działanie matematyczne, i to o bardzo określonej strukturze, np ebx+4*eax. jeśli potrzebujesz tylko konkretnego adresu, bez żadnego mnożnika i przesunięcia, można użyć po prostu MOV:

mov eax, data

dlaczego w książce instrukcja została użyta bez nawiasów w drugim argumencie instrukcji ?
może błąd?

0
Azarien napisał(a):
  1. czy twoja książka jest konkretnie do NASM-a? NASM ma trochę inną składnię niż inne asemblery dla x86, ale za to bardziej konsekwentną.
    data oznacza zawsze adres zmiennej „data”.
    [data] oznacza zawsze wartość mieszczącą się pod adresem data.

  2. instrukcja LEA nie wykonuje żadnej magii, jak to czasami sugerują. wykonuje aż i tylko działanie matematyczne, i to o bardzo określonej strukturze, np ebx+4*eax. jeśli potrzebujesz tylko konkretnego adresu, bez żadnego mnożnika i przesunięcia, można użyć po prostu MOV:

mov eax, data

dlaczego w książce instrukcja została użyta bez nawiasów w drugim argumencie instrukcji ?
może błąd?

Ok, dzięki!

1 użytkowników online, w tym zalogowanych: 0, gości: 1