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])?
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').
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
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.
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.
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
.
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.
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.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.
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