Цитата:
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.
Да, и ещё: ни одна из этих команд не портит ни флагов, ни сегментных регистров. Не надо гнать лажу.