Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

lea vs mov

314
02 февраля 2004 года
fanto
374 / / 15.02.2003
Не скажете ли что эффективтей lea или mov offset?
И вообще КАКАЯ РАЗНИЦА?!
1.8K
02 февраля 2004 года
gwg605
76 / / 06.03.2003
Цитата:
Originally posted by fanto
Не скажете ли что эффективтей lea или mov offset?
И вообще КАКАЯ РАЗНИЦА?!



По поводу эффективности, точно не скажу, но судя по тому что Intel C++ Compiler использует всетаки lea, то скорее всего lea эффективней, но по мне mov должен быть быстрее. Используется непосредственный операнд, команда и операнд в очереди на выполнение, нужно только переслать из очереди в регистр, вроде как должна использоваться только внктрення шина, в то время как lea должна будет задействовать систему вычисления адреса и только после этого записать результат в регистр. ???

А разница большая, mov не позволяет делать вычисления, а lea позволяет. Для примера:
lea edx,[eax*4+edx]
в результате к edx будет прибавлено произведение eax и 4-х.

Плюс в том что это вычисление будет сделано блоком вычисления адреса, а основное ALU будет свободно. Что позволяет процу в некоторых случаях праллелить выполнение команд.

1.8K
03 февраля 2004 года
Exfector
74 / / 12.10.2002
Цитата:
Originally posted by fanto
Не скажете ли что эффективтей lea или mov offset?
И вообще КАКАЯ РАЗНИЦА?!



Вот он вылазиет, дуализм классических ассемблеров... Использовал бы к примеру NASM - вопрос бы некий невозник ;)

5.8K
04 февраля 2004 года
noFX
7 / / 27.11.2003
Цитата:
Originally posted by fanto
Не скажете ли что эффективтей lea или mov offset?
И вообще КАКАЯ РАЗНИЦА?!


разница в том что lea это команда поцессора и выполняется естессно при загрузке проги,а mov offset точнее только offset это фишка компилятора он ещё в процессе компиляции подсчитает смещение той или иной метки которая указана после offset

1.8K
04 февраля 2004 года
gwg605
76 / / 06.03.2003
Цитата:
Originally posted by noFX

разница в том что lea это команда поцессора и выполняется естессно при загрузке проги,а mov offset точнее только offset это фишка компилятора он ещё в процессе компиляции подсчитает смещение той или иной метки которая указана после offset



Не согласен.

 
Код:
v1 DB ?

mov eax,OFFSET v1
lea eax,[v1]

В обоих случаях компилятор высчитает смещение к переменной v1, в первом случае явно указан, во втором случае - не явно. В этом различия нет.
2.1K
04 февраля 2004 года
UjinNash
64 / / 29.11.2003
Цитата:
Originally posted by gwg605


Не согласен.
 
Код:
v1 DB ?

mov eax,OFFSET v1
lea eax,[v1]

В обоих случаях компилятор высчитает смещение к переменной v1, в первом случае явно указан, во втором случае - не явно. В этом различия нет.


Сравни вот это:

 
Код:
lea bx,[v1+bp+si]

   mov bx,offset v1
   add bx,bp
   add bx,si

Ну как, разница есть?
1.8K
04 февраля 2004 года
gwg605
76 / / 06.03.2003
Цитата:
Originally posted by UjinNash

Сравни вот это:
 
Код:
lea bx,[v1+bp+si]

   mov bx,offset v1
   add bx,bp
   add bx,si

Ну как, разница есть?



Конечно :)

Но офсет для V1 всеравно высчитывается. Из того постинга, было не ясно что там участвует неявное вычисление офсета.

ЗЫ. Чета я последнее время занудствую :)

36K
03 августа 2008 года
dimonua89
1 / / 29.01.2008
Команду LEA часто используют для быстрых арифметических вычислений например умножение:
lea bx,[ebx+ebx*4]; BX=EBX*5

или сложение:
lea ebx, [eax+12]; EBX=EAX+12

эти команды меньше чем соответствующие mov и add, и не изменяют флаги
349
03 августа 2008 года
Phantom-84
656 / / 27.10.2005
Археолог :)
lea используется для вычисления адреса на этапе выполнения программы, а mov - на этапе компиляции, т.е. к примеру нет смысла использовать команду lea eax,[var].
Цитата:
эти команды меньше чем соответствующие mov и add, и не изменяют флаги

И для этого тоже.

39K
11 августа 2008 года
kupec
17 / / 11.08.2008
команда lea eax, [var1]
идентична mov eax, offset var1
работают они обе за один такт, но в режиме 32-битной адресации
lea eax, [var1] будет весить на байт больше, а в 16-битной адресации, но с 32-битными регистрами mov eax, offset var1 будет занимать больше места, чем lea eax, [var1], так как в первой команде offset var1 запишется как 4 байтное число, а во второй как 2 байтное.
В итоге если от lea не требуется арифметики, то лучше его и не использовать.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог