Co oznaczają nawiasy w x86 asm?

Podano następujący kod:

L1     db    "word", 0

       mov   al, [L1]
       mov   eax, L1

Co oznaczają nawiasy ([L1])?

Author: starblue, 2010-01-08

8 answers

[L1] oznacza zawartość pamięci pod adresem L1. Po uruchomieniu mov al, [L1] tutaj, rejestr al otrzyma bajt na adres L1 (litera 'w').

 41
Author: interjay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-08 20:06:31

Oznacza po prostu uzyskanie pamięci pod adres oznaczony etykietą L1.

Jeśli lubisz C, pomyśl o tym tak: [L1] jest tym samym co *L1

 29
Author: Earlz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-08 20:11:14

Operandy tego typu, takie jak [ebp], nazywane są operandami pamięci .

Wszystkie odpowiedzi tutaj są dobre, ale widzę, że nikt nie mówi o zastrzeżeniu w stosowaniu tego jako sztywnej reguły - jeśli nawiasy, to dereferencja, z wyjątkiem instrukcji lea .

lea jest wyjątkiem od powyższej zasady. Say we ' ve

mov eax, [ebp - 4]

Wartość ebp jest odejmowana przez 4, a nawiasy wskazują, że otrzymana wartość jest traktowana jako adres i wartość pod tym adresem jest przechowywana w eax. Jednak w przypadku lea nawiasy nie oznaczałyby, że:

lea eax, [ebp - 4]

Wartość ebp jest odejmowana przez 4, a otrzymana wartość jest przechowywana w eax. Ta instrukcja po prostu obliczy adres i zapisze obliczoną wartość w rejestrze docelowym. Zobacz ten post Po Więcej Szczegółów.

 27
Author: legends2k,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-13 15:30:29

Nawiasy oznaczają usunięcie odniesienia do adresu. Na przykład

mov eax, [1234]

Oznacza, przenieść zawartość adresu 1234 do EAX. Więc:

1234 00001

EAX będzie zawierał 00001.

 5
Author: Jason Evans,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-16 03:15:25

Bezpośrednie adresowanie pamięci - al zostanie załadowany z wartością znajdującą się pod adresem pamięci L1.

 2
Author: John Dibling,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-13 09:31:25

Jak w wielu językach asemblera, oznacza to indirection. Innymi słowy, pierwszy mov ładuje al z zawartością z L1 (innymi słowy bajt 'w'), a nie adresem.

Twój drugi mov faktycznie ładuje eax z adresem L1 i można później dereferencja, że aby uzyskać lub ustawić jego zawartość.

W obu tych przypadkach, L1 jest koncepcyjnie uważany za adres.

 0
Author: paxdiablo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-08 20:07:07

Oznaczają one, że zamiast przenosić wartość rejestru lub wartość liczbową L1 do rejestru al, traktować wartość rejestru lub wartość liczbową L1 jako wskaźnik do pamięci, pobierać zawartość tego adresu pamięci i przenosić tę zawartość do al.

W tym przypadku L1 jest miejscem pamięci, ale ta sama logika miałaby zastosowanie, gdyby nazwa rejestru była w nawiasach:

mov al, [ebx]
Znany również jako ładunek.
 0
Author: Alex Brown,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-08 20:07:29

Wskazuje, że rejestr powinien być używany jako wskaźnik rzeczywistej lokalizacji, zamiast działać na samym rejestrze.

 0
Author: Ignacio Vazquez-Abrams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-08 20:07:34