<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=101848&amp;view=findpost&amp;p=880140</guid>
        <pubDate>Sun, 09 Oct 2005 20:42:48 +0000</pubDate>
        <title>Интересные способы применения команды LEA</title>
        <link>https://forum.sources.ru/index.php?showtopic=101848&amp;view=findpost&amp;p=880140</link>
        <description><![CDATA[captain cobalt: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>lea eax,[eax*4]; 7 байт &#33;Умножать можно только на беззнаковые числа кратные 4-ом &#33;</div></div> Не очень понятное утверждение.<br>
<br>
Как известно, на уровне кодов операций под масштабирующий множитель, отводится два бита. Множитель - это степень двойки и может принимать одно из четырёх значений: 1, 2, 4 или 8. Это позволяет умножать регистр с помощью LEA на такие числа: <div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">LEA EAX,[EAX + EAX*2] ;3</div><div class="code_line">LEA EAX,[EAX*4] &nbsp; &nbsp; &nbsp; ;4</div><div class="code_line">LEA EAX,[EAX + EAX*4] ;5</div><div class="code_line">LEA EAX,[EAX*8] &nbsp; &nbsp; &nbsp; ;8</div><div class="code_line">LEA EAX,[EAX + EAX*8] ;9</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>]]></description>
        <author>captain cobalt</author>
        <category>Assembler FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=101848&amp;view=findpost&amp;p=773611</guid>
        <pubDate>Mon, 11 Jul 2005 10:07:51 +0000</pubDate>
        <title>Интересные способы применения команды LEA</title>
        <link>https://forum.sources.ru/index.php?showtopic=101848&amp;view=findpost&amp;p=773611</link>
        <description><![CDATA[ProgramMan:  <br>
<div class='tag-align-center'><span class='tag-size' data-value='13' style='font-size:13pt;'><span class="tag-color tag-color-named" data-value="blue" style="color: blue"><strong class='tag-b'>Интересные способы применения команды LEA</strong></span></span></div><br>
Инструкция записывает в регистр, указанные в первом параметре, адрес ячейки памяти из второго параметра.<br>
Например:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">lea eax,[123456h]</div><div class="code_line">;eax=123456h</div></ol></div></div></div></div><br>
Инструкция обычно применяется для определения точных адресов, при относительной адресации через регистры:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">lea eax,[esp-4] ; узнать точный адрес переменной в стеке</div><div class="code_line">; для последующей передачи его, например в API функцию</div></ol></div></div></div></div><br>
Тут для нас возникает несколько интересных возможностей, связанных со способами адресации.<br>
Ясно, что при <br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">lea eax,[eax]</div></ol></div></div></div></div><br>
значение eax не изменится,а при <br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">lea eax,[eax+ebx]; 3 байта</div></ol></div></div></div></div><br>
будет аналогично<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;</div><div class="code_line">Add eax,ebx; 2 байта</div></ol></div></div></div></div><br>
Или:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">lea eax,[eax*4]; 7 байт !Умножать можно только на беззнаковые числа кратные 4-ом !</div><div class="code_line">;и</div><div class="code_line">mov ebx,4 ; 5 байт</div><div class="code_line">mul ebx &nbsp; ; 2 байта</div></ol></div></div></div></div><br>
Можно усложнить выражение:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">lea eax,[ebx+ecx*4] ; 3 байта</div><div class="code_line">;и</div><div class="code_line">mov eax,ecx ; 2 байта </div><div class="code_line">mov edx,4 ; 5 байт</div><div class="code_line">mul edx ; 2 байта</div><div class="code_line">add eax,ebx ; &nbsp;2 байта</div></ol></div></div></div></div><br>
Таким образом в некоторых случаях использовать lea для вычислений выгоднее.]]></description>
        <author>ProgramMan</author>
        <category>Assembler FAQ</category>
      </item>
	
      </channel>
      </rss>
	