Интересные способы применения команды LEA
, Общие вопросы
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.156] |
|
|

Интересные способы применения команды LEA
, Общие вопросы
|
Сообщ.
#1
,
|
|
|
|
Интересные способы применения команды LEA Инструкция записывает в регистр, указанные в первом параметре, адрес ячейки памяти из второго параметра. Например: ![]() ![]() lea eax,[123456h] ;eax=123456h Инструкция обычно применяется для определения точных адресов, при относительной адресации через регистры: ![]() ![]() lea eax,[esp-4] ; узнать точный адрес переменной в стеке ; для последующей передачи его, например в API функцию Тут для нас возникает несколько интересных возможностей, связанных со способами адресации. Ясно, что при ![]() ![]() lea eax,[eax] значение eax не изменится,а при ![]() ![]() lea eax,[eax+ebx]; 3 байта будет аналогично ![]() ![]() Add eax,ebx; 2 байта Или: ![]() ![]() lea eax,[eax*4]; 7 байт !Умножать можно только на беззнаковые числа кратные 4-ом ! ;и mov ebx,4 ; 5 байт mul ebx ; 2 байта Можно усложнить выражение: ![]() ![]() lea eax,[ebx+ecx*4] ; 3 байта ;и mov eax,ecx ; 2 байта mov edx,4 ; 5 байт mul edx ; 2 байта add eax,ebx ; 2 байта Таким образом в некоторых случаях использовать lea для вычислений выгоднее. |
|
|
|
|
|
Цитата Не очень понятное утверждение.lea eax,[eax*4]; 7 байт !Умножать можно только на беззнаковые числа кратные 4-ом ! Как известно, на уровне кодов операций под масштабирующий множитель, отводится два бита. Множитель - это степень двойки и может принимать одно из четырёх значений: 1, 2, 4 или 8. Это позволяет умножать регистр с помощью LEA на такие числа: ![]() ![]() LEA EAX,[EAX + EAX*2] ;3 LEA EAX,[EAX*4] ;4 LEA EAX,[EAX + EAX*4] ;5 LEA EAX,[EAX*8] ;8 LEA EAX,[EAX + EAX*8] ;9 |