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, поскольку это мощная инструкция.
Comments