Язык ассемблера с изменением памяти

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

две инструкции кажутся одинаковыми, но комментарий отличается

  1. mov esi, 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, это только если эта метка var1 или 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