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



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

MOV AX, [TABLE-ADDR]

и

LEA AX, [TABLE-ADDR]
261   7  

7 ответов:

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

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

цель 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]   ; i.e. 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-immediate вместо нагрузки.

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

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

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

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, а не смещение 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

в принципе ... - Переезжай в Редж ... после вычисления его..." это, кажется, хорошо и для других целей:)

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

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-это "перемещение", фактически копия адреса, который обозначает метка TABLE-ADDR. Инструкция LEA - это "эффективный адрес загрузки", который является косвенной инструкцией, что означает, что TABLE-ADDR указывает на ячейку памяти, в которой находится адрес для загрузки.

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

    Ничего не найдено.

Добавить ответ:
Отменить.