Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.21.97.61] |
|
Сообщ.
#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 для вычислений выгоднее. |
Сообщ.
#2
,
|
|
|
Цитата Не очень понятное утверждение.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 |