В чем разница между 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, поэтому он является мощной инструкцией.

  • C #: зачем подписывать сборку?
  • Как я могу просмотреть MSIL / CIL, сгенерированный компилятором C #? Почему это называется сборкой?
  • Цикл с вызовом функции быстрее, чем пустой цикл
  • Как скомпилировать и запустить программу C в Sublime Text 2?
  • Безопасно ли читать конец конца буфера на одной странице на x86 и x64?
  • Что регистрирует сохранение в соглашении вызова ARM C?
  • Определить версию сборки (CLR) сборки
  • x86_64 - Условия сборки и выход из строя
  • Как точно работает инструкция x86 LOOP?
  • mscorlib.dll & System.dll
  • использование ILMerge с библиотеками .NET 4
  • Давайте будем гением компьютера.