На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Перед отправкой сообщения внимательно прочтите правила раздела!!!
1. Все статьи должны быть оформлены согласно Правил оформления статей.
2. Любые обсуждения должны происходить в специальной теме, обсуждение в любых других темах раздела запрещены.
3. Запрещается писать статьи о создании и распространении вирусов, троянов и других вредоносных программ!
4. За грамотно написанные и правильно оформленные статьи авторы награждаются DigiMoney.

Дополнительные ссылки:
Желаю творческих успехов! ;)
Модераторы: Jin X
  
    > Интересные способы применения команды LEA , Общие вопросы
       
      Интересные способы применения команды LEA

      Инструкция записывает в регистр, указанные в первом параметре, адрес ячейки памяти из второго параметра.
      Например:
      ExpandedWrap disabled
        lea eax,[123456h]
        ;eax=123456h

      Инструкция обычно применяется для определения точных адресов, при относительной адресации через регистры:
      ExpandedWrap disabled
        lea eax,[esp-4] ; узнать точный адрес переменной в стеке
        ; для последующей передачи его, например в API функцию

      Тут для нас возникает несколько интересных возможностей, связанных со способами адресации.
      Ясно, что при
      ExpandedWrap disabled
        lea eax,[eax]

      значение eax не изменится,а при
      ExpandedWrap disabled
        lea eax,[eax+ebx]; 3 байта

      будет аналогично
      ExpandedWrap disabled
         
        Add eax,ebx; 2 байта

      Или:
      ExpandedWrap disabled
        lea eax,[eax*4]; 7 байт !Умножать можно только на беззнаковые числа кратные 4-ом !
        mov ebx,4 ; 5 байт
        mul ebx   ; 2 байта

      Можно усложнить выражение:
      ExpandedWrap disabled
        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 на такие числа:
        ExpandedWrap disabled
          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
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0214 ]   [ 16 queries used ]   [ Generated: 24.04.24, 16:33 GMT ]