Асемблер, препращащ към паметта

аз съм начинаещ в асемблерния език, разбирам много неща досега, но в продължение на много дни се задържах в един раздел, това е объркващо за мен и най-лошото е, че през многото страници, които посетих в интернет, информацията отново се изкривява, този раздел е Режими на адресиране по-специално на препратка към паметта, така че например в това Режими на адресиране в асемблерния език (IA-32 NASM)

две инструкции изглеждат еднакви, но коментарът е различен

  1. mov esi, var: Копира адреса на var (да кажем 0x0040120e) в esi
  2. mov dword [eax], var1: копира стойност във var1 в слота за памет
    , посочен от eax

и двете инструкции се занимават с var или var1, които са етикети, но в коментарите за едната се споменава, че се копира съдържанието, докато за другата се копира адреса.

и така задавам още един въпрос какво ще бъде съдействието за тази инструкция:

  • mov bx, [var]

и каква е разликата между тези инструкции също

така че трябва да знам каква е разликата и има ли източник на увереност, от който мога да чета и да съм сигурен, че е правилен, между другото, използвам това урок и NASM като асемблер под windows.


person user2963216    schedule 09.06.2014    source източник


Отговори (1)


mov dword [eax], var1: копира стойността във var1 в слота за памет, определен от eax

не Ако var1 е етикет, това ще съхрани адреса на var1 като 32-битова стойност в паметта, към която сочи eax. Например, ако адресът на var1 е 0x04000000 и eax съдържа 0x12345678, тогава това ще запише 0x04000000 в паметта на 0x12345678.


какъв ще бъде коментарът за тази инструкция: mov bx, [var] ?

; Move the word located at var into bx

(забележка: "преместване" в асемблирането наистина означава копиране)


mov [var], bx това приложимо ли е само ако var е масив? ако не, с какво се различава от mov var, bx?

Типовете всъщност не се налагат от асемблера. Можете да съхранявате всичко навсякъде (е, навсякъде, където програмата ви има право да пише). Така че това, което сте декларирали като var, е до голяма степен без значение. Може да има код, разположен на var за всички грижи на асемблера (това вероятно няма да е толкова добра идея, освен ако наистина не знаете какво правите).

Разликата с mov var,bx е, че mov var,bx не е валидна инструкция. Адресът на var е незабавен, така че това би било нещо като да кажете mov 5, bx, което очевидно не работи.


lea eax, [var] — стойността в var се поставя в EAX

Не. Адресът на var е поставен в eax. LEA означава Зареждане на ефективен адрес. Давате му операнд на паметта по същия начин, както ако ще имате достъп до паметта, но вместо стойността на този адрес получавате самия адрес.

LEA може също да се използва за извършване на някои прости аритметични действия. Например lea ebx,[eax*4 + eax] ще изчисли eax*5 и ще постави резултата в ebx.


LEA EBX, [MY_TABLE] тук неговият среден ефективен адрес

да Няма разлика между този и предишния пример.

person Michael    schedule 09.06.2014
comment
така че ви казвам какво разбирам и ме коригирайте, ако има: ако var е етикет, така че използването със скоби mov bx, [var] копира съдържанието и без скоби означава адреса -› mov dword [eax], var1, това е само ако този labelvar1 или var е изходен операнд, с други думи правилният операнд. Но ако това е дестинацията, има обратното значение, което означава, че използването на скоби означава препращане към адреса, както в mov [var], bx, а без скоби означава незабавна стойност, както в mov var,bx, което не е приложимо. - person user2963216; 09.06.2014
comment
Скобите имат едно и също значение, независимо дали се използват в операнда източник или в операнда местоназначение: label означава адреса на label (все пак в синтаксиса на NASM), а [label] означава дерефериране на този адрес. Адресът на етикет не става незабавен; това е незабавно. Ако напишете нещо като mov eax, 5 / mov eax, var, ще откриете, че асемблерът извежда абсолютно същия код на операцията и в двата случая. - person Michael; 10.06.2014
comment
о, добре, сега разбирам, това дерефериране на адреса означава, че има достъп до съдържанието на този адрес. - person user2963216; 10.06.2014