lea vs mov
И вообще КАКАЯ РАЗНИЦА?!
Не скажете ли что эффективтей lea или mov offset?
И вообще КАКАЯ РАЗНИЦА?!
По поводу эффективности, точно не скажу, но судя по тому что Intel C++ Compiler использует всетаки lea, то скорее всего lea эффективней, но по мне mov должен быть быстрее. Используется непосредственный операнд, команда и операнд в очереди на выполнение, нужно только переслать из очереди в регистр, вроде как должна использоваться только внктрення шина, в то время как lea должна будет задействовать систему вычисления адреса и только после этого записать результат в регистр. ???
А разница большая, mov не позволяет делать вычисления, а lea позволяет. Для примера:
lea edx,[eax*4+edx]
в результате к edx будет прибавлено произведение eax и 4-х.
Плюс в том что это вычисление будет сделано блоком вычисления адреса, а основное ALU будет свободно. Что позволяет процу в некоторых случаях праллелить выполнение команд.
Не скажете ли что эффективтей lea или mov offset?
И вообще КАКАЯ РАЗНИЦА?!
Вот он вылазиет, дуализм классических ассемблеров... Использовал бы к примеру NASM - вопрос бы некий невозник ;)
Не скажете ли что эффективтей lea или mov offset?
И вообще КАКАЯ РАЗНИЦА?!
разница в том что lea это команда поцессора и выполняется естессно при загрузке проги,а mov offset точнее только offset это фишка компилятора он ещё в процессе компиляции подсчитает смещение той или иной метки которая указана после offset
разница в том что lea это команда поцессора и выполняется естессно при загрузке проги,а mov offset точнее только offset это фишка компилятора он ещё в процессе компиляции подсчитает смещение той или иной метки которая указана после offset
Не согласен.
mov eax,OFFSET v1
lea eax,[v1]
В обоих случаях компилятор высчитает смещение к переменной v1, в первом случае явно указан, во втором случае - не явно. В этом различия нет.
Не согласен.
mov eax,OFFSET v1
lea eax,[v1]
В обоих случаях компилятор высчитает смещение к переменной v1, в первом случае явно указан, во втором случае - не явно. В этом различия нет.
Сравни вот это:
mov bx,offset v1
add bx,bp
add bx,si
Ну как, разница есть?
Сравни вот это:
mov bx,offset v1
add bx,bp
add bx,si
Ну как, разница есть?
Конечно :)
Но офсет для V1 всеравно высчитывается. Из того постинга, было не ясно что там участвует неявное вычисление офсета.
ЗЫ. Чета я последнее время занудствую :)
lea bx,[ebx+ebx*4]; BX=EBX*5
или сложение:
lea ebx, [eax+12]; EBX=EAX+12
эти команды меньше чем соответствующие mov и add, и не изменяют флаги
lea используется для вычисления адреса на этапе выполнения программы, а mov - на этапе компиляции, т.е. к примеру нет смысла использовать команду lea eax,[var].
И для этого тоже.
идентична mov eax, offset var1
работают они обе за один такт, но в режиме 32-битной адресации
lea eax, [var1] будет весить на байт больше, а в 16-битной адресации, но с 32-битными регистрами mov eax, offset var1 будет занимать больше места, чем lea eax, [var1], так как в первой команде offset var1 запишется как 4 байтное число, а во второй как 2 байтное.
В итоге если от lea не требуется арифметики, то лучше его и не использовать.