Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Assembler
Перезагрузить страницу Объясните доступно разницу между lea eax,X1 и mov eax,OFFSET X1
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
yureckor yureckor вне форума
Member
 
Сообщений: 462
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 11.03.2004
По умолчанию Объясните доступно разницу между lea eax,X1 и mov eax,OFFSET X1 - 11.03.2004, 09:48

Вопрос: люди! Объясните доступно разницу между
lea eax,X1
и
mov eax,OFFSET X1 ?
Ответить с цитированием
  (#2 (permalink)) Старый
diabolo diabolo вне форума
Новичок
 
Сообщений: 7
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 26.12.2003
По умолчанию 11.03.2004, 16:27

Да в общем-то ничем, кроме того факта, что lea работает как правило намного быстрее mov и никогда не портит флагов.
Ответить с цитированием
  (#3 (permalink)) Старый
yureckor yureckor вне форума
Member
 
Сообщений: 462
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 11.03.2004
По умолчанию 11.03.2004, 20:30

Да ведь вроде и mov флагов не портит. Или lea чего-то делает еще впридачу с сегментными регистрами?
Ответить с цитированием
  (#4 (permalink)) Старый
Anonymous
Guest
 
Сообщений: n/a
По умолчанию 12.03.2004, 01:30

Команда MOV работает не медленнее команды LEA. На старых процессорах команда MOV была быстрее LEA. Однако возможности LEA значительно богаче, например, можно написать:
Код:
lea eax,[esi + ebx * 4 + offser array]
и это будет правильно работать. При использовании MOV вычисления адреса пришлось бы сделать руками.
Ответить с цитированием
  (#5 (permalink)) Старый
diabolo diabolo вне форума
Новичок
 
Сообщений: 7
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 26.12.2003
По умолчанию 12.03.2004, 10:31

На счет скорости - это вопрос спорный, я не просто так сказал: "как правило", достаточно попрагать между intel/amd/cyrix, чтобы заметить интересные особенности lea...

По поводу флагов - та же фигня, реально нигде не определено состояние флагов после mov, иногда наталкиваешся на весьма интересные эффекты.
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
UNV UNV вне форума
Новичок
 
Сообщений: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 10.03.2004
По умолчанию Re: Вопрос: LEA и OFFSET - 12.03.2004, 16:56

Цитата:
Originally posted by yureckor
[b]Вопрос: люди! Объясните доступно разницу между
lea eax,X1
и
mov eax,OFFSET X1 ?
Разница весьма проста. Команда lea позволяет вычислить физический адрес переменной и загрузить его регистр.
Например:
Код:
mov eax,[table+ebx+esi*4]
можно заменить на:
Код:
lea ecx,[table+ebx+esi*4]
mov eax,[ecx]
Команда mov используется для помещения в регистр/переменную в памяти значения другого регистра/переменной, либо непосредственного значения, константы.

В том случае, когда адрес переменной состоит лишь из константного смещения, либо только из индекса можно использовать с равным успехом как lea, так и mov:

Код:
lea eax,[table]  =  mov eax,offset table
lea eax,[ebx]    =  mov eax,ebx
В более сложных случаях нужно пользоваться lea.
Однако нельзя забывать, что команда mov reg,imm оптимизирована по размеру и будет на 1 байт короче аналогичной lea. К тому же lea загружает блок генерации адреса процессора, т.е. может создать проблемы для распараллеливания на конвейере.
Так что лучше в простых случаях использовать именно mov, а не lea.

Да, и ещё: ни одна из этих команд не портит ни флагов, ни сегментных регистров. Не надо гнать лажу.
Ответить с цитированием
  (#7 (permalink)) Старый
_Cyclope _Cyclope вне форума
Member
 
Сообщений: 211
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 15.06.2003
По умолчанию 14.03.2004, 19:31

Похоже, что тов. UNV просто АСМ-профи.
Тогда к нему вопрос--а какая конструкция лучше спаривается--mov offset или lea?
Ответить с цитированием
  (#8 (permalink)) Старый
UNV UNV вне форума
Новичок
 
Сообщений: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 10.03.2004
По умолчанию 16.03.2004, 13:31

Цитата:
Originally posted by _Cyclope
[b]Похоже, что тов. UNV просто АСМ-профи.
Тогда к нему вопрос--а какая конструкция лучше спаривается--mov offset или lea?
Если есть возможность использовать mov offset - используйте mov offset. Использовать lea в таком случае - дурной тон. Как я уже сказал, инструкция mov займёт минимум ресурсов процессора, а также будет на 1 байт короче. Хотя обе инструкции в случае константного операнда лишены зависимости по данным, но блоков генерации адреса у процессора явно меньше, чем регистров.

Единственный случай предпочтительного использования lea - помещение в 32-битный регистр 8-битного непосредственного операнда (например: lea eax,[10]). В таком случае опкод будет на 2 байта короче.
Ответить с цитированием
  (#9 (permalink)) Старый
yureckor yureckor вне форума
Member
 
Сообщений: 462
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 11.03.2004
По умолчанию 26.03.2004, 12:41

Понял я в чем разница.

mov eax,OF x1
ясно дело тоже самое, что и например
mov eax,5
только вместо 5 компилятор число соотв. пишет (адрес x1)

А вот
lea eax,x1 -команда lea если по правде не адрес
вычисляет, а вообще чего угодно, т.е. просто в eax сует
число- адрес x1. Но можно туда вычислить и
lea eax,[ecx*4+edx-3] ;eax=ecx*4+edx-3 -скобки [] не используются
lea eax,[ebx+12]
и т.п.

Нужно, например узнать адрес локальной переменной:

proba proc
local x:DWORD
...
;mov eax,OFFSET x- ясно работать не будет, адрес то
;каждый раз разный [ebp-4] это же не заранее известная
;цифра

lea eax,x ;это тоже самое что lea eax,[ebp-4]
;и тоже самое что
;mov eax,ebp
;sub eax,4
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Доступно лишь половоина физической памяти -Immortal- Память 11 22.11.2011 09:54
Объяните разницу между ЖК и LED-монитором GMO Мониторы 3 24.09.2011 00:16
помогите новичку найти разницу лупик Материнские платы 0 11.07.2011 20:02
С++ - объясните различия между float и double. Rafff Любые вопросы от новичков 2 04.04.2010 11:46
Из 4 гб ОЗУ доступно только 1.99 гб razorblade Память 7 24.12.2009 16:16
Объясните разницу (Intel Core I3, I5, I7, I9) Sheb Процессоры 6 04.11.2009 13:31
Борьба с масивами как сделать разницу Serbery Delphi 5 27.02.2009 00:57
На встроенном видео Intel(R) 82865G Graphic не доступно ускорение текстур. pan111 Техническая поддержка 1 10.12.2008 16:59
Процессора 45nm или 65nm??? Объясните разницу плиз и что лучше? AndreasMRS Любые вопросы от новичков 2 13.08.2008 13:07
Как оптимально получить разницу во времени Radm C++ Builder 4 04.08.2007 12:43
Замечу ли я разницу в производительности после замены планок памяти? DvcD Техническая поддержка 4 26.05.2007 17:36
Что за ошибка invalid request BLR at offset 180 Anonymous Visual C++ 2 01.08.2003 15:14



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов