В чем разница между MOV и LEA?

Я хотел бы знать, в чем разница между этими инструкциями:

MOV AX, [TABLE-ADDR] 

а также

 LEA AX, [TABLE-ADDR] 

  • LEA означает «Эффективный адрес загрузки»
  • MOV означает значение нагрузки

Короче говоря, LEA загружает указатель на объект, который вы адресуете, тогда как MOV загружает фактическое значение по этому адресу.

objective LEA – дать возможность выполнить нетривиальный расчет адреса и сохранить результат [для последующего использования]

 LEA ax, [BP+SI+5] ; Compute address of value MOV ax, [BP+SI+5] ; Load value at that address 

Там, где есть только константы, MOV (через постоянные вычисления ассемблера) иногда может пересекаться с простейшими случаями использования LEA . Это полезно, если у вас есть многочастный расчет с несколькими базовыми адресами и т. Д.

В синтаксисе NASM:

 mov eax, var == lea eax, [var] ; ie mov r32, imm32 lea eax, [var+16] == mov eax, var+16 lea eax, [eax*4] == shl eax, 2 ; but without setting flags 

В синтаксисе MASM используйте OFFSET var чтобы получить mov-instant вместо нагрузки.

Команда MOV reg, addr означает чтение переменной, хранящейся в адресе addr, в регистр reg. Инструкция LEA reg, addr означает считывание адреса (а не переменной, хранящейся по адресу) в регистр reg.

Другая форма инструкции MOV – это MOV reg, immdata, которая означает считывание непосредственных данных (то есть константных) immdata в регистр reg. Обратите внимание, что если addr в реестре LEA, addr – это просто константа (т. Е. Фиксированное смещение), то эта инструкция LEA по существу точно такая же, как эквивалентная команда MOV reg, immdata, которая загружает ту же константу, что и непосредственные данные.

Если вы укажете только литерал, нет никакой разницы. У LEA больше возможностей, и вы можете прочитать о них здесь:

http://www.oopweb.com/Assembly/Documents/ArtOfAssembly/Volume/Chapter_6/CH06-1.html#HEADING1-136

Это зависит от используемого ассемблера, потому что

 mov ax,table_addr 

в MASM работает как

 mov ax,word ptr[table_addr] 

Таким образом, он загружает первые байты из table_addr и NOT offset на table_addr . Вы должны использовать вместо этого

 mov ax,offset table_addr 

или

 lea ax,table_addr 

который работает одинаково.

Версия lea также отлично работает, если table_addr является локальной переменной, например

 some_procedure proc local table_addr[64]:word lea ax,table_addr 

В принципе … «Перейдите в REG … после его вычисления …», похоже, это хорошо для других целей 🙂

если вы просто забыли, что это значение является указателем, вы можете использовать его для оптимизации / минимизации кода … что когда-либо ..

 MOV EBX , 1 MOV ECX , 2 ;//with 1 instruction you got result of 2 registers in 3rd one ... LEA EAX , [EBX+ECX+5] 

EAX = 8

оригинально это было бы:

 MOV EAX, EBX ADD EAX, ECX ADD EAX, 5 

Разница тонкая, но важная. Инструкция MOV – это «MOVe», фактически копия адреса, на который указывает метка TABLE-ADDR. Инструкция LEA представляет собой «Load Effective Address», который является косвенной инструкцией, что означает, что TABLE-ADDR указывает на ячейку памяти, в которой найден адрес для загрузки.

Эффективно использование LEA эквивалентно использованию указателей в таких языках, как C, поэтому он является мощной инструкцией.

  • Почему медленная инструкция цикла? Не удалось ли Intel эффективно внедрить его?
  • Сделать муравей тихий без флага -q?
  • Загрузка нескольких версий одной и той же сборки
  • Дополнительная информация о макете памяти исполняемой программы (процесса)
  • Как я могу просмотреть MSIL / CIL, сгенерированный компилятором C #? Почему это называется сборкой?
  • mscorlib.dll & System.dll
  • Не удалось загрузить файл или сборку HRESULT: 0x80131515 (При добавлении controllerа в проект MVC с ссылками на сборку на сетевом диске)
  • Возможно ли «декомпилировать» Windows .exe? Или, по крайней мере, рассмотреть Ассамблею?
  • Безопасно ли читать конец конца буфера на одной странице на x86 и x64?
  • Как использовать строки в emu8086
  • Эффективное умножение матрицы 4x4 (C vs assembly)
  • Interesting Posts

    Загружать локальные данные JSON в jQgrid без AddJsonRows

    Насколько распространены старые x64-процессоры, не имеющие инструкции cmpxchg16b?

    Установить gem для старого ruby ​​1.8 на Mac OS X 10.9 Maverics

    excel macro (VBA) для переноса нескольких столбцов в несколько строк

    Откройте другое приложение с вашего собственного (намеренного)

    Почему zip-файл больше, чем исходный файл, особенно когда он является текстом?

    Изменение диска с файловой системой Windows 10

    Обработка ошибок (отправка клиенту ex.Message)

    Java 8 forEach с индексом

    Что делать 1. # INF00, -1. # IND00 и -1. # IND означает?

    Как преодолеть предел classа Case Scala из 22 полей?

    Как заставить ForceShell возвращать массив, когда вызов возвращает только один объект?

    pinpointing “условный переход или перемещение зависит от неинициализированного значения (значений)” valgrind message

    Где хранятся ключевые слова для поиска хрома / хрома?

    C # получение имен файлов без расширений

    Давайте будем гением компьютера.