<?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=418165&amp;view=findpost&amp;p=3828813</guid>
        <pubDate>Sun, 19 Apr 2020 09:18:45 +0000</pubDate>
        <title>Scratch registers в asm-вставке GCC</title>
        <link>https://forum.sources.ru/index.php?showtopic=418165&amp;view=findpost&amp;p=3828813</link>
        <description><![CDATA[Jin X: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=418165&view=findpost&p=3828789'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-04-18T21:09:48+03:00">18.04.20, 18:09</time></span><div class='quote '>ты можешь дать ответ, если подумаешь и свяжешь воедино мои и свои слова.</div></div>Я всё равно не нахожу ответа и логики в этом.<br>
Ты сравниваешь это с макросами и со связыванием двух сущностей (регистра и переменной, к примеру). Я не вижу причин, почему такая связь не может рушиться на выходе из asm-блока. Ведь clobbers рушат другие связи (указанный регистр с ранее связанной переменной, ещё до asm-блока, которая не фигурирует ни в inputs, ни в outputs).<br>
<br>
Ещё раз:<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=418165&view=findpost&p=3828772'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Jin X &#064; <time class="tag-quote__quoted-time" datetime="2020-04-18T15:21:57+00:00">18.04.20, 15:21</time></span><div class='quote '>Ведь если регистр указан и в inputs, и в outputs, то эта логика нарушается, ибо как можно связать регистр сразу с двумя аргументами? А если можно, значит в какой-то момент регистр отвязывается от input-аргумента, а в какой-то привязывается к output-аргументу. Почему же нельзя отвязать и не привязывать ни к чему?</div></div>]]></description>
        <author>Jin X</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=418165&amp;view=findpost&amp;p=3828789</guid>
        <pubDate>Sat, 18 Apr 2020 18:09:48 +0000</pubDate>
        <title>Scratch registers в asm-вставке GCC</title>
        <link>https://forum.sources.ru/index.php?showtopic=418165&amp;view=findpost&amp;p=3828789</link>
        <description><![CDATA[Qraizer: <strong class='tag-b'>Jin X</strong>, тебе осталось совсем немного. К примеру, на<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=418165&view=findpost&p=3828772'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Jin X &#064; <time class="tag-quote__quoted-time" datetime="2020-04-18T15:21:57+00:00">18.04.20, 15:21</time></span><div class='quote '>Я не знаю, в чём тут прикол, но вероятно, раньше такое делать можно было, но потом (зачем-то) убрали. Мне хочется понять: ЗАЧЕМ?</div></div>ты можешь дать ответ, если подумаешь и свяжешь воедино мои и свои слова.<br>
<br>
P.S. Впрочем, это не отменяет того факта, что всё это домыслы. Однако выглядят в целом логично, потому отвергать их нет нужды.]]></description>
        <author>Qraizer</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=418165&amp;view=findpost&amp;p=3828777</guid>
        <pubDate>Sat, 18 Apr 2020 16:07:46 +0000</pubDate>
        <title>Scratch registers в asm-вставке GCC</title>
        <link>https://forum.sources.ru/index.php?showtopic=418165&amp;view=findpost&amp;p=3828777</link>
        <description><![CDATA[Jin X: <span class='tag-u'>Как я это всё понимаю?</span><br>
<br>
В блоке <strong class='tag-b'>asm</strong> есть:<ul class="tag-list"><li><strong class='tag-b'><em class='tag-i'>выражение на ассемблере</em></strong> (собственно, код на ассемблере),</li><li>параметры <strong class='tag-b'><em class='tag-i'>inputs</em></strong> и <strong class='tag-b'><em class='tag-i'>outputs</em></strong> (каждый из которых состоит из <strong class='tag-b'><em class='tag-i'>связки</em></strong> (регистр, память и пр. – сущность, которая обозначена строкой, именуемой в доке словом constraints) и <strong class='tag-b'><em class='tag-i'>аргумента</em></strong>),</li><li>параметры <strong class='tag-b'><em class='tag-i'>clobbers</em></strong> (содержащие только <strong class='tag-b'><em class='tag-i'>связки</em></strong>, но обозначаемые несколько иначе, чем в <strong class='tag-b'><em class='tag-i'>inputs</em></strong> и <strong class='tag-b'><em class='tag-i'>outputs</em></strong>).</li><li><strong class='tag-b'><em class='tag-i'>GotoLabels</em></strong>, хотя они нас не очень интересуют.</li></ul><br>
<span class='tag-u'>Как это работает?</span><br>
<br>
Компилятор:<ol class="tag-list" type="1"><li>Заносит <strong class='tag-b'><em class='tag-i'>input-аргументы</em></strong> в <strong class='tag-b'><em class='tag-i'>input-связки</em></strong>, т.е. если указано <strong class='tag-b'>&quot;c&quot;(x)</strong>, то делает <strong class='tag-b'>mov ecx,x</strong>; а если <strong class='tag-b'>&quot;r&quot;(x)</strong>, то <strong class='tag-b'>mov ЛюбойСвободныйРегистр,x</strong> (либо ничего не делает, если <strong class='tag-b'>x</strong> уже есть в каком-то регистре). И разумеется, запоминает, что <strong class='tag-b'><em class='tag-i'>аргумент</em></strong> теперь в этой <strong class='tag-b'><em class='tag-i'>связке</em></strong> (например, значение  <strong class='tag-b'>x</strong> в регистре <strong class='tag-b'>ecx</strong>).</li><li>Заменяет в <strong class='tag-b'><em class='tag-i'>выражении на ассемблере</em></strong> выражения <strong class='tag-b'>%0</strong>, <strong class='tag-b'>%1</strong>, <strong class='tag-b'>%2</strong> на <strong class='tag-b'><em class='tag-i'>input-связки</em></strong>.</li><li>Заменяет в <strong class='tag-b'><em class='tag-i'>выражении на ассемблере</em></strong> %l-выражения с метками, указанными в <strong class='tag-b'><em class='tag-i'>GotoLabels</em></strong>, на правильные имена меток.</li><li>Вставляет <strong class='tag-b'><em class='tag-i'>выражение на ассемблере</em></strong> в код.</li><li>Заносит <strong class='tag-b'><em class='tag-i'>output-связки</em></strong> в <strong class='tag-b'><em class='tag-i'>output-аргументы</em></strong>, т.е. если указано <strong class='tag-b'>&quot;=a&quot;(z)</strong>, то делает <strong class='tag-b'>mov z,eax</strong>. Либо ничего не делает (если <strong class='tag-b'>z</strong>, скажем, не <strong class='tag-b'>volatile</strong>), а просто запоминает, что значение <strong class='tag-b'>z</strong> хранится в <strong class='tag-b'>eax</strong>, запишет, когда (и если) посчитает это нужным.</li><li>Все параметры, указанные в <strong class='tag-b'><em class='tag-i'>clobbers</em></strong>, объявляет неопределённым (для себя самого), т.е. отвязывает все эти параметры от каких-либо значений, ячеек памяти и т.д. Т.о., отныне он не может опираться на то, что там хранятся какие-либо известные ему данные и понимает, что там теперь может быть всё, что угодно.</li></ol><br>
Соответственно, если в <strong class='tag-b'><em class='tag-i'>inputs</em></strong> указано <strong class='tag-b'>&quot;c&quot;(x)</strong>, а в <strong class='tag-b'><em class='tag-i'>outputs</em></strong> и в <strong class='tag-b'><em class='tag-i'>clobbers</em></strong> нет <strong class='tag-b'>&quot;c&quot;</strong>/<strong class='tag-b'>&quot;ecx&quot;</strong>, значит компилятор полагает, что в <strong class='tag-b'>ecx</strong> по прежнему лежит <strong class='tag-b'>x</strong>. Иначе не полагает. Вот и вся логика.<br>
<br>
<span class='tag-u'>Ещё раз про <strong class='tag-b'><em class='tag-i'>clobbers</em></strong></span><br>
<br>
К примеру, если мы указали в <strong class='tag-b'><em class='tag-i'>clobbers</em></strong> параметр <strong class='tag-b'>&quot;eax&quot;</strong>, а перед вставкой <strong class='tag-b'><em class='tag-i'>выражения на ассемблере</em></strong> в код компилятор занёс туда <strong class='tag-b'>x</strong>, то при чтении значения из <strong class='tag-b'>x</strong> после <strong class='tag-b'><em class='tag-i'>выражения на ассемблере</em></strong> он не может теперь использовать регистр <strong class='tag-b'>eax</strong>, т.к. там уже может быть не <strong class='tag-b'>x</strong>, а всё, что угодно. Если мы указали <strong class='tag-b'>&quot;memory&quot;</strong>, а перед вставкой <strong class='tag-b'><em class='tag-i'>выражения на ассемблере</em></strong> в код он занёс в <strong class='tag-b'>eax</strong> значение <strong class='tag-b'>x</strong>, то он опять не может использовать <strong class='tag-b'>eax</strong> при чтении значения из <strong class='tag-b'>x</strong>, т.к. значение <strong class='tag-b'>x</strong> могло измениться, и в <strong class='tag-b'>eax</strong> теперь будет устаревшее значение <strong class='tag-b'>x</strong>, а не актуальное.<br>
<br>
<br>
Вот, собственно, и всё. К чему выдумывать какие-то дополнительные ограничения?<br>
Каждый блок параметров обрабатывается отдельно и причин, почему одна и та же <strong class='tag-b'><em class='tag-i'>связка</em></strong> не может быть и в <strong class='tag-b'><em class='tag-i'>inputs</em></strong>, и в <strong class='tag-b'><em class='tag-i'>clobbers</em></strong>, я не вижу.<br>
Возможно, это немного упрощённое описание, но сути оно не меняет.<br>
<br>
Если у меня где-то ошибка в логике, прошу указать где, в чём и почему :)]]></description>
        <author>Jin X</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=418165&amp;view=findpost&amp;p=3828772</guid>
        <pubDate>Sat, 18 Apr 2020 15:21:57 +0000</pubDate>
        <title>Scratch registers в asm-вставке GCC</title>
        <link>https://forum.sources.ru/index.php?showtopic=418165&amp;view=findpost&amp;p=3828772</link>
        <description><![CDATA[Jin X: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=418165&view=findpost&p=3828705'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-04-17T13:53:52+00:00">17.04.20, 13:53</time></span><div class='quote '>Это не передача параметров, это связывание двух разных представлений одной и той же сущности. Если что-то указано как инпут, но не указано как аутпут, значит оно инпут, и баста. Ты не можешь, имея два представления одной сущности, ожидать, что изменяя одно, оставишь другое неизменным.</div></div>С чего ты взял, что это связывание? Если указано как инпут, пусть будет как инпут. Но почему нельзя ему быть в клобберах? См. ниже.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=418165&view=findpost&p=3828705'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-04-17T13:53:52+00:00">17.04.20, 13:53</time></span><div class='quote '>ты же писал макросы? Как ты себе представляешь отвязку параметра макроса от его аргумента?</div></div>При чём тут макросы, Саш? :)<br>
В макросах идёт подстановка аргумента вместо параметра в таком виде, в каком его передали, и используется &quot;как есть&quot;. Это как #define, даже не связывание, а просто подстановка. Здесь же это не макросы, не #define&#39;ы, здесь в регистр заносится значение заранее. Даже когда ты пишешь <strong class='tag-b'>mov %0,%%edx</strong> при input-аргументе <strong class='tag-b'>&quot;r&quot;(x)</strong>, то компилятор может сделать сначала <strong class='tag-b'>mov x,%eax</strong>, а уже потом <strong class='tag-b'>mov %eax,%edx</strong>. Не делает он это только тогда, когда <strong class='tag-b'>x</strong> уже в регистре, и нет разницы какой регистр использовать: <a class='tag-url' href='https://gcc.godbolt.org/z/NBQL9X' target='_blank'>https://gcc.godbolt.org/z/NBQL9X</a><br>
А если есть разница, тогда оптимизация не срабатывает: <a class='tag-url' href='https://gcc.godbolt.org/z/UipRRN' target='_blank'>https://gcc.godbolt.org/z/UipRRN</a><br>
Но он не станет делать <strong class='tag-b'>mov x,%edx</strong> (без последующего <strong class='tag-b'>mov %0,%%edx</strong>): <a class='tag-url' href='https://gcc.godbolt.org/z/4nEAGx' target='_blank'>https://gcc.godbolt.org/z/4nEAGx</a> (заметь, тут включена оптимизация&#33;)<br>
Повторюсь: почему ты считаешь, что регистр жёстко связывается с аргументом? Ведь если регистр указан и в inputs, и в outputs, то эта логика нарушается, ибо как можно связать регистр сразу с двумя аргументами? А если можно, значит в какой-то момент регистр отвязывается от input-аргумента, а в какой-то привязывается к output-аргументу. Почему же нельзя отвязать и не привязывать ни к чему?<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=418165&view=findpost&p=3828705'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-04-17T13:53:52+00:00">17.04.20, 13:53</time></span><div class='quote '>В большинстве случаев&quot; так компилятору приходится поступать из-за ограничений инструкций целевого процессора. Тут, например, невозможно src из памяти сразу подать на вход movs, потому ему приходится его копировать в esi. И обратно, если это ещё и выход. К семантике asm это не имеет отношения, как её спроектировали, это другой вопрос.</div></div>Компилятор вообще ничего не знает о том, что происходит внутри asm-вставки, т.к. это не его дело. Я могу написать там любую абракадабру, и он схавает. Запнётся только асм-транслятор.<br>
Смотри: <a class='tag-url' href='https://gcc.godbolt.org/z/xrhNZz' target='_blank'>https://gcc.godbolt.org/z/xrhNZz</a>, ошибки нет :)<br>
Для компилятора всё происходящее внутри – чёрный ящик. Он может только заменять <strong class='tag-b'>%0</strong> (и т.п.) на нужные значения и всё.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=418165&view=findpost&p=3828705'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-04-17T13:53:52+00:00">17.04.20, 13:53</time></span><div class='quote '>Возможно, что раньше, году эдак в 75-ом, её и можно было бы спроектировать иначе, но в 2020-ом нежелание это делать я вполне понимаю. И скорее наоборот, буду выступать против, если меня спросят, потому как даже представить себе не могу, сколько кода по всему миру может быть затронуто сайд-эффектами от смены дизайна.</div></div>Нежелание делать что? :huh: Я в этом месте потерял нить твоей мысли :-? Позволять писать в clobbers регистры из input?<br>
Если добавить возможность указывать одни и те же регистры и в input, и в clobbers, старый код никуда не денется, потому что там нет input-регистров в clobbers.<br>
А в новом будет возможность сделать по-новому.<br>
<br>
Смотри: <a class='tag-url' href='http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#s5' target='_blank'>http://www.ibiblio.org/gferg/ldp/GCC-Inlin...y-HOWTO.html#s5</a><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;&nbsp; &nbsp; &nbsp; &nbsp;asm (&quot;cld\n\t&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;rep\n\t&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;stosl&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : /* no output registers */</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : &quot;c&quot; (count), &quot;a&quot; (fill_value), &quot;D&quot; (dest)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : &quot;%ecx&quot;, &quot;%edi&quot; </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; );</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>Я не знаю, в чём тут прикол, но вероятно, раньше такое делать можно было, но потом (зачем-то) убрали. Мне хочется понять: ЗАЧЕМ?<br>
А ты говоришь о сайд-эффектах. Тут вон отсутствие обратном несовместимости просто&#33;]]></description>
        <author>Jin X</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=418165&amp;view=findpost&amp;p=3828705</guid>
        <pubDate>Fri, 17 Apr 2020 13:53:52 +0000</pubDate>
        <title>Scratch registers в asm-вставке GCC</title>
        <link>https://forum.sources.ru/index.php?showtopic=418165&amp;view=findpost&amp;p=3828705</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=418165&view=findpost&p=3828679'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Jin X &#064; <time class="tag-quote__quoted-time" datetime="2020-04-17T07:19:27+00:00">17.04.20, 07:19</time></span><div class='quote '>Зачем вот это тут? Тогда уж в clobbers это прописывать надо, т.к. outputs – это то, что компилятор должен записать, а тут мы всё делаем сами.</div></div>Та после экспериментов осталось. Можно ж ещё и так:<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;&nbsp;asm volatile</div><div class="code_line">&nbsp;&nbsp;(</div><div class="code_line">&nbsp;&nbsp; &nbsp; &quot;movl %1, &nbsp; &nbsp; &nbsp; %%esi\n\t&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &quot;movl %0, &nbsp; &nbsp; &nbsp; %%edi\n\t&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &quot;movl %[length],%%ecx\n\t&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &quot;cld\n\t&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &quot;rep movsl\n\t&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp; : &quot;=m&quot;(*(int(*)[count])dst)</div><div class="code_line">&nbsp;&nbsp; &nbsp; : &quot;m&quot;(*(int(*)[count])src), [length]&quot;m&quot;(count)</div><div class="code_line">&nbsp;&nbsp; &nbsp; : &quot;ecx&quot;, &quot;esi&quot;, &quot;edi&quot;</div><div class="code_line">&nbsp;&nbsp;);</div></ol></div></div></div></div>Не увидел разницы, так что нет смысла в усложнении. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-04-17T14:01:59+00:00">17.04.20, 14:01</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=418165&view=findpost&p=3828704'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Jin X &#064; <time class="tag-quote__quoted-time" datetime="2020-04-17T13:41:48+00:00">17.04.20, 13:41</time></span><div class='quote '>Это же не ссылка (бескомпромиссно&#33;), а некий аналог переменной, самостоятельной, хоть и на более физическом уровне. На примере той же функции – есть передача параметров по ссылке, а есть по значению. Почему нельзя этот же принцип использовать здесь? Я не вижу никаких технических проблем в этом.</div></div>Ещё раз &quot;ещё раз&quot;. Это не передача параметров, это связывание двух разных представлений одной и той же сущности. Если что-то указано как инпут, но не указано как аутпут, значит оно инпут, и баста. Ты не можешь, имея два представления одной сущности, ожидать, что изменяя одно, оставишь другое неизменным. <strong class='tag-b'>Jin X</strong>, ты же писал макросы? Как ты себе представляешь отвязку параметра макроса от его аргумента? <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-04-17T14:12:37+00:00">17.04.20, 14:12</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=418165&view=findpost&p=3828704'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Jin X &#064; <time class="tag-quote__quoted-time" datetime="2020-04-17T13:41:48+00:00">17.04.20, 13:41</time></span><div class='quote '>Правильно, inputs – это и есть создание копии (по крайней мере, во многих случаях).</div></div>&quot;В большинстве случаев&quot; так компилятору приходится поступать из-за ограничений инструкций целевого процессора. Тут, например, невозможно src из памяти сразу подать на вход movs, потому ему приходится его копировать в esi. И обратно, если это ещё и выход. К семантике asm это не имеет отношения, как её спроектировали, это другой вопрос. Возможно, что раньше, году эдак в 75-ом, её и можно было бы спроектировать иначе, но в 2020-ом нежелание это делать я вполне понимаю. И скорее наоборот, буду выступать против, если меня спросят, потому как даже представить себе не могу, сколько кода по всему миру может быть затронуто сайд-эффектами от смены дизайна. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-04-17T14:20:35+00:00">17.04.20, 14:20</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=418165&view=findpost&p=3828704'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Jin X &#064; <time class="tag-quote__quoted-time" datetime="2020-04-17T13:41:48+00:00">17.04.20, 13:41</time></span><div class='quote '>Поэтому я хочу сделать <strong class='tag-b'>y = x; y++</strong>, а мне говорят: &quot;Неее, <strong class='tag-b'>y = x</strong> и баста&#33; А если хочешь <strong class='tag-b'>y++</strong>, тогда будь добр потом сделать <strong class='tag-b'>z = y</strong>, даже если тебе <strong class='tag-b'>z</strong> будет не нужен&quot;. Причём неважно, используется ли этот <strong class='tag-b'>y++</strong> внутри или изменяется вхолостую.</div></div>Это конкретные специфические особенности конкретного специфического процессора в конкретном специфическом случае. Вероятно, делать универсальный asm в семействе GNU было не очень хорошей идеей, но минусов от этого решения всё-таки куда меньше плюсов. Единый движок оптимизатора, например, однозначно плюс, ибо в классических интелово-майрософтовых решениях любая asm-вставка нередко ломает оптимизацию всей функции. Как по-моему, в конкретных специфических случаях проще сделать копию, чем хакнуть дизайн. Несложно же привязать этот же инпут-параметр к другому объекту, объявив его аутпутом?]]></description>
        <author>Qraizer</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=418165&amp;view=findpost&amp;p=3828704</guid>
        <pubDate>Fri, 17 Apr 2020 13:41:48 +0000</pubDate>
        <title>Scratch registers в asm-вставке GCC</title>
        <link>https://forum.sources.ru/index.php?showtopic=418165&amp;view=findpost&amp;p=3828704</link>
        <description><![CDATA[Jin X: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=418165&view=findpost&p=3828703'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-04-17T13:25:19+00:00">17.04.20, 13:25</time></span><div class='quote '>естественно, что esi, меняясь, меняет и src</div></div>Не вижу в этом ничего естественного. Это же не ссылка (бескомпромиссно&#33;), а некий аналог переменной, самостоятельной, хоть и на более физическом уровне. На примере той же функции – есть передача параметров по ссылке, а есть по значению. Почему нельзя этот же принцип использовать здесь? Я не вижу никаких технических проблем в этом. Я же могу связать регистр с переменной в outputs, но только на выходе, не связывая их на входе. Почему нельзя связать на входе, не связывая на выходе? Тем более, что я могу привязать один и тот же регистр в inputs и outputs к разным переменным, поэтому аналогия с привязкой тут не очень удачная.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=418165&view=findpost&p=3828703'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-04-17T13:25:19+00:00">17.04.20, 13:25</time></span><div class='quote '>Ты ж фактически хочешь, чтобы на C можно было писать x++, но без изменения x. Ну выйдет же, придётся писать x+1 или сделать копию x, которой уже и делать ++.</div></div>Правильно, inputs – это и есть создание копии (по крайней мере, во многих случаях). Поэтому я хочу сделать <strong class='tag-b'>y = x; y++</strong>, а мне говорят: &quot;Неее, <strong class='tag-b'>y = x</strong> и баста&#33; А если хочешь <strong class='tag-b'>y++</strong>, тогда будь добр потом сделать <strong class='tag-b'>z = y</strong>, даже если тебе <strong class='tag-b'>z</strong> будет не нужен&quot;. Причём неважно, используется ли этот <strong class='tag-b'>y++</strong> внутри или изменяется вхолостую.<br>
<br>
Cобственно, мы имеем то, что имеем и повлиять на это можем в лучшем случае создав запрос или самостоятельно исправив исходники (если их потом примут).]]></description>
        <author>Jin X</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=418165&amp;view=findpost&amp;p=3828703</guid>
        <pubDate>Fri, 17 Apr 2020 13:25:19 +0000</pubDate>
        <title>Scratch registers в asm-вставке GCC</title>
        <link>https://forum.sources.ru/index.php?showtopic=418165&amp;view=findpost&amp;p=3828703</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=418165&view=findpost&p=3828679'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Jin X &#064; <time class="tag-quote__quoted-time" datetime="2020-04-17T07:19:27+00:00">17.04.20, 07:19</time></span><div class='quote '>Проще было бы разрешить писать в clobbers регистры, которые указаны в inputs. Иначе это лишние телодвижения и не очень красивый код.</div></div>Если это позволить, то привязки инпутов просто не смогут работать. Параметры asm – это не вызов подпрограммы с передачей аргументов, это прокси между двумя разными языками с разной грамматикой. Указав, что некий, скажем, esi привязывается к src, ты делаешь между ними альяс, и естественно, что esi, меняясь, меняет и src. Если ты об этом не сообщишь компилятору, ты его просто обманешь, так что на это либо нужно забить, если это применимо, либо придётся указать esi в аутпутах, чтоб не обманывать. Ты ж фактически хочешь, чтобы на C можно было писать x++, но без изменения x. Ну выйдет же, придётся писать x+1 или сделать копию x, которой уже и делать ++.]]></description>
        <author>Qraizer</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=418165&amp;view=findpost&amp;p=3828679</guid>
        <pubDate>Fri, 17 Apr 2020 07:19:27 +0000</pubDate>
        <title>Scratch registers в asm-вставке GCC</title>
        <link>https://forum.sources.ru/index.php?showtopic=418165&amp;view=findpost&amp;p=3828679</link>
        <description><![CDATA[Jin X: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=418165&view=findpost&p=3828667'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-04-16T18:04:01+00:00">16.04.20, 18:04</time></span><div class='quote '>Если же не без разницы, тогда будь добр либо укажи на это компилятору аутпутом для этой переменной, либо сделай для неё копию, и меняй её.</div></div>Проще было бы разрешить писать в clobbers регистры, которые указаны в inputs. Иначе это лишние телодвижения и не очень красивый код.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=418165&view=findpost&p=3828667'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-04-16T18:04:01+00:00">16.04.20, 18:04</time></span><div class='quote '>Как вариант, ты можешь руками написать весь асмовый код. Тогда и компилятору ничего объяснять не придётся.</div></div>В принципе, да. Это будет проще, пожалуй, чем объявлять фиктивные доп. переменные.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=418165&view=findpost&p=3828667'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-04-16T18:04:01+00:00">16.04.20, 18:04</time></span><div class='quote '>&quot;=m&quot;(*(int(*)[count])dst)</div></div>Зачем вот это тут? Тогда уж в clobbers это прописывать надо, т.к. outputs – это то, что компилятор должен записать, а тут мы всё делаем сами.]]></description>
        <author>Jin X</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=418165&amp;view=findpost&amp;p=3828667</guid>
        <pubDate>Thu, 16 Apr 2020 18:04:01 +0000</pubDate>
        <title>Scratch registers в asm-вставке GCC</title>
        <link>https://forum.sources.ru/index.php?showtopic=418165&amp;view=findpost&amp;p=3828667</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=418165&view=findpost&p=3828666'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Jin X &#064; <time class="tag-quote__quoted-time" datetime="2020-04-16T17:53:17+00:00">16.04.20, 17:53</time></span><div class='quote '>Это иллюстрация того, что если регистра нет в outputs и clobbers, то компилер имеет право думать, что регистр не изменился.</div></div>Именно. Ровно так работает и C, согласись: когда ты не используешь переменную в выражении, она и не меняется. Та и вообще любой язык так работает. И никто не будет переписывать специфический фрагмент анализатора под специфический случай специфического процессора. Если тебе без разницы, что esi, с которым связан параметр src, меняется, забей, и пусть компилятор тоже забьёт. Если же не без разницы, тогда будь добр либо укажи на это компилятору аутпутом для этой переменной, либо сделай для неё копию, и меняй её. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-04-16T18:07:15+00:00">16.04.20, 18:07</time></span></span><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">while (--count != 0)</div><div class="code_line">&nbsp;&nbsp;*dst++ = *src++;</div></ol></div></div></div></div>но желаешь, чтобы все три переменные остались вроде бы прежними. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-04-16T18:09:39+00:00">16.04.20, 18:09</time></span></span><br>
P.S. Как вариант, ты можешь руками написать весь асмовый код. Тогда и компилятору ничего объяснять не придётся. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-04-16T18:33:59+00:00">16.04.20, 18:33</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=418165&view=findpost&p=3828414'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Jin X &#064; <time class="tag-quote__quoted-time" datetime="2020-04-13T20:58:12+00:00">13.04.20, 20:58</time></span><div class='quote '>И тут ещё один вопрос рождается: если я указал в clobbers callee-save регистры, мне же не нужно их сохранять/восстанавливать, верно (точнее говоря, я надеюсь), компилятор сделает это сам?</div></div>Совсем забыл.<br>
Да. По идее он постарается не задействовать эти регистры вообще, но если не получится, то озаботится сам. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-04-16T18:37:48+00:00">16.04.20, 18:37</time></span></span><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">void* foo(const void *src, void *dst, int count)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;asm volatile</div><div class="code_line">&nbsp;&nbsp;(</div><div class="code_line">&nbsp;&nbsp; &nbsp; &quot;movl src, &nbsp; %%esi\n\t&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &quot;movl dst, &nbsp; %%edi\n\t&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &quot;movl count, %%ecx\n\t&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &quot;cld\n\t&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &quot;rep movsl\n\t&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp; : &quot;=m&quot;(*(int(*)[count])dst)</div><div class="code_line">&nbsp;&nbsp; &nbsp; :</div><div class="code_line">&nbsp;&nbsp; &nbsp; : &quot;ecx&quot;, &quot;esi&quot;, &quot;edi&quot;</div><div class="code_line">&nbsp;&nbsp;);</div><div class="code_line">&nbsp;&nbsp;return (int*)dst + count;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">void* bar(const void *src, void *dst, int count)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;return (int*)dst + count;</div><div class="code_line">}</div></ol></div></div></div></div>Результат:<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">_foo:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pushl &nbsp; %ebp</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;%esp, %ebp</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pushl &nbsp; %edi</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pushl &nbsp; %esi</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;12(%ebp), %eax</div><div class="code_line">/APP</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl src, &nbsp; %esi</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl dst, &nbsp; %edi</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl count, %ecx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;cld</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;rep movsl</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">/NO_APP</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;16(%ebp), %eax</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;sall &nbsp; &nbsp;, %eax</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;addl &nbsp; &nbsp;12(%ebp), %eax</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;popl &nbsp; &nbsp;%esi</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;popl &nbsp; &nbsp;%edi</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;popl &nbsp; &nbsp;%ebp</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ret</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;; ...</div><div class="code_line">&nbsp;</div><div class="code_line">_bar:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pushl &nbsp; %ebp</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;%esp, %ebp</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;16(%ebp), %eax</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;sall &nbsp; &nbsp;, %eax</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;addl &nbsp; &nbsp;12(%ebp), %eax</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;popl &nbsp; &nbsp;%ebp</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ret</div></ol></div></div></div></div>Первая функция в виду того, что в ней задействованы esi и edi, которые в соответствие с ABI могут являться регистровыми переменными, сохранены на входе и восстановлены на выходе, несмотря на то, что, кроме как в клобберсах, нигде не упомянуты; а вот ecx, который не входит в число зарезервированных для регистровых переменных, оставлен без внимания, несмотря на то, что тоже задействован в клобберсах и только в них. Вторая функция не заморочилась избыточными push/pop.]]></description>
        <author>Qraizer</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=418165&amp;view=findpost&amp;p=3828666</guid>
        <pubDate>Thu, 16 Apr 2020 17:53:17 +0000</pubDate>
        <title>Scratch registers в asm-вставке GCC</title>
        <link>https://forum.sources.ru/index.php?showtopic=418165&amp;view=findpost&amp;p=3828666</link>
        <description><![CDATA[Jin X: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=418165&view=findpost&p=3828665'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-04-16T17:25:06+00:00">16.04.20, 17:25</time></span><div class='quote '>Что бы это значило?</div></div>Х/з, edi после как не использовался, так и не используется, поэтому, видимо, он туда ничего и не пишет. У тебя уровень оптимизации какой?<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=418165&view=findpost&p=3828665'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-04-16T17:25:06+00:00">16.04.20, 17:25</time></span><div class='quote '>cltd</div></div>AT&amp;T ужасен, как так можно извратить имя cdq?<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=418165&view=findpost&p=3828665'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-04-16T17:25:06+00:00">16.04.20, 17:25</time></span><div class='quote '>Значит ты не прав, что не считаешь его результатом asm-вставки.</div></div>Это иллюстрация того, что если регистра нет в outputs и clobbers, то компилер имеет право думать, что регистр не изменился.]]></description>
        <author>Jin X</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=418165&amp;view=findpost&amp;p=3828665</guid>
        <pubDate>Thu, 16 Apr 2020 17:25:06 +0000</pubDate>
        <title>Scratch registers в asm-вставке GCC</title>
        <link>https://forum.sources.ru/index.php?showtopic=418165&amp;view=findpost&amp;p=3828665</link>
        <description><![CDATA[Qraizer: Ради интереса заменил на<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;&nbsp;asm volatile</div><div class="code_line">&nbsp;&nbsp;(</div><div class="code_line">&nbsp;&nbsp; &nbsp; &quot;cld\n\t&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &quot;rep movsl\n\t&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp; : &quot;=m&quot;(*(int(*)[count])dst)</div><div class="code_line">&nbsp;&nbsp; &nbsp; : &quot;S&quot;(src), &quot;D&quot;(dst), &quot;c&quot;(count)</div><div class="code_line">&nbsp;&nbsp;);</div></ol></div></div></div></div>и получил:<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">_foo:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pushl &nbsp; %ebp</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;%esp, %ebp</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pushl &nbsp; %edi</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pushl &nbsp; %esi</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pushl &nbsp; %ebx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;subl &nbsp; &nbsp;, %esp</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;3, -16(%ebp)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;6, %edx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;9, %ebx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;1, -20(%ebp)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;4, -24(%ebp)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;7, -28(%ebp)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;12(%ebp), %eax</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;8(%ebp), %esi</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;12(%ebp), %edi</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;16(%ebp), %ecx</div><div class="code_line">/APP</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;cld</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;rep movsl</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">/NO_APP</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;addl &nbsp; &nbsp;-16(%ebp), %edx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;subl &nbsp; &nbsp;%ebx, %edx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;-20(%ebp), %eax</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;addl &nbsp; &nbsp;-24(%ebp), %eax</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;subl &nbsp; &nbsp;-28(%ebp), %eax</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;%eax, -32(%ebp)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;%edx, %eax</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;cltd</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;idivl &nbsp; -32(%ebp)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;%eax, -32(%ebp)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;-32(%ebp), %eax</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;addl &nbsp; &nbsp;, %esp</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;popl &nbsp; &nbsp;%ebx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;popl &nbsp; &nbsp;%esi</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;popl &nbsp; &nbsp;%edi</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;popl &nbsp; &nbsp;%ebp</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ret</div></ol></div></div></div></div>Теперь даже a лежит на стеке вместо eax. Что бы это значило?.. :-? Может быть, так он делает барьер между стековым фреймом и остальной памятью, а может быть просто особенность кодогенерации, ни на что не влияющая. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-04-16T17:27:19+00:00">16.04.20, 17:27</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=418165&view=findpost&p=3828664'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Jin X &#064; <time class="tag-quote__quoted-time" datetime="2020-04-16T17:17:42+00:00">16.04.20, 17:17</time></span><div class='quote '>Как видишь, он спокойно юзает rdi, будто он не изменился.</div></div>Гы. Значит ты не прав, что не считаешь его результатом asm-вставки.]]></description>
        <author>Qraizer</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=418165&amp;view=findpost&amp;p=3828664</guid>
        <pubDate>Thu, 16 Apr 2020 17:17:42 +0000</pubDate>
        <title>Scratch registers в asm-вставке GCC</title>
        <link>https://forum.sources.ru/index.php?showtopic=418165&amp;view=findpost&amp;p=3828664</link>
        <description><![CDATA[Jin X: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=418165&view=findpost&p=3828661'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-04-16T16:29:30+00:00">16.04.20, 16:29</time></span><div class='quote '>Тот факт, что esi, edi и ecx тоже меняются, компилятору и без нас известно посредством &quot;S&quot;, &quot;D&quot; и &quot;c&quot;.</div></div>Откуда ж ему это будет известно, когда эти &quot;S&quot;, &quot;D&quot;, &quot;c&quot; указаны в инпутах? :)<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=418165&view=findpost&p=3828662'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-04-16T16:40:31+00:00">16.04.20, 16:40</time></span><div class='quote '>Ну разве не красота</div></div>Сейчас я тебе красоту покажу :)<br>
<a class='tag-url' href='https://gcc.godbolt.org/z/d_TZNF' target='_blank'>https://gcc.godbolt.org/z/d_TZNF</a><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">long test(long src, long dst, long count)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;__asm__ __volatile__ (</div><div class="code_line">&nbsp;&nbsp; &nbsp; &quot;cld\n\t&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &quot;rep movsq\n\t&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp; :</div><div class="code_line">&nbsp;&nbsp; &nbsp; : &quot;S&quot;(src), &quot;D&quot;(dst), &quot;c&quot;(count)</div><div class="code_line">&nbsp;&nbsp; &nbsp; : &quot;memory&quot;</div><div class="code_line">&nbsp;&nbsp;);</div><div class="code_line">&nbsp;&nbsp;return src + dst + count;</div><div class="code_line">}</div></ol></div></div></div></div><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">test(long, long, long):</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov &nbsp; &nbsp; r8, rdi</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov &nbsp; &nbsp; rcx, rdx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov &nbsp; &nbsp; rdi, rsi</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov &nbsp; &nbsp; rsi, r8</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;cld</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;rep movsq</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;add &nbsp; &nbsp; r8, rdi</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;lea &nbsp; &nbsp; rax, [r8+rdx]</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ret</div></ol></div></div></div></div>Как видишь, он спокойно юзает rdi, будто он не изменился.<br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-04-16T17:18:28+00:00">16.04.20, 17:18</time></span></span><br>
&quot;memory&quot; на это никак не влияет.]]></description>
        <author>Jin X</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=418165&amp;view=findpost&amp;p=3828663</guid>
        <pubDate>Thu, 16 Apr 2020 17:03:04 +0000</pubDate>
        <title>Scratch registers в asm-вставке GCC</title>
        <link>https://forum.sources.ru/index.php?showtopic=418165&amp;view=findpost&amp;p=3828663</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=418165&view=findpost&p=3828499'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Jin X &#064; <time class="tag-quote__quoted-time" datetime="2020-04-14T22:24:09+00:00">14.04.20, 22:24</time></span><div class='quote '>Кроме того, я не понимаю, зачем там вообще используется параметр <strong class='tag-b'>&quot;m&quot; (*(const char (*)[]) p)</strong>. Для чего он нужен, ты понимаешь?</div></div>Ну, он указывает, что исходные данные лежат в памяти по адресу p. Точнее – что инпутом является массив байтов неопределённого размера, на который указывает p. Зачем? А фик его знает. Возможно, оптимизатору это будет полезно знать, например, с точки зрения memory_order. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-04-16T17:06:46+00:00">16.04.20, 17:06</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=418165&view=findpost&p=3828499'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Jin X &#064; <time class="tag-quote__quoted-time" datetime="2020-04-14T22:24:09+00:00">14.04.20, 22:24</time></span><div class='quote '>И в примере с <strong class='tag-b'>sumsq</strong> я не могу уловить смысл дублирования x и y: <strong class='tag-b'>&quot;m&quot; (*x), &quot;m&quot; (*y)</strong>. Прочитал несколько раз, но всё равно не доходит.</div></div>Это не дублирование. Во-первых, упомянутое memory_order может помочь в расстановке барьеров. В нашем коде &quot;memory&quot; в клабберсах служит вообще-то для того же, но слишком грубый. Во-вторых, они отдельно описывают значения, на которые ссылаются x и y, что может помочь оптимизатору при анализе окружающего контекста и генерации его кода.]]></description>
        <author>Qraizer</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=418165&amp;view=findpost&amp;p=3828662</guid>
        <pubDate>Thu, 16 Apr 2020 16:40:31 +0000</pubDate>
        <title>Scratch registers в asm-вставке GCC</title>
        <link>https://forum.sources.ru/index.php?showtopic=418165&amp;view=findpost&amp;p=3828662</link>
        <description><![CDATA[Qraizer: Усложним ему жизнь. Займём регистры. Для сравнения тут же рядом такая же функция, но без asm.<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">int foo(const void *src, void *dst, int count)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;register int a = 123, b = 456, c = 789;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;asm volatile</div><div class="code_line">&nbsp;&nbsp;(</div><div class="code_line">&nbsp;&nbsp; &nbsp; &quot;cld\n\t&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &quot;rep movsl\n\t&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp; :</div><div class="code_line">&nbsp;&nbsp; &nbsp; : &quot;S&quot;(src), &quot;D&quot;(dst), &quot;c&quot;(count)</div><div class="code_line">&nbsp;&nbsp; &nbsp; : &quot;memory&quot;</div><div class="code_line">&nbsp;&nbsp;);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;return a+b-c;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">int bar(const void *src, void *dst, int count)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;register int a = 123, b = 456, c = 789;</div><div class="code_line">&nbsp;</div><div class="code_line">/* &nbsp;asm volatile</div><div class="code_line">&nbsp;&nbsp;(</div><div class="code_line">&nbsp;&nbsp; &nbsp; &quot;cld\n\t&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &quot;rep movsl\n\t&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp; :</div><div class="code_line">&nbsp;&nbsp; &nbsp; : &quot;S&quot;(src), &quot;D&quot;(dst), &quot;c&quot;(count)</div><div class="code_line">&nbsp;&nbsp; &nbsp; : &quot;memory&quot;</div><div class="code_line">&nbsp;&nbsp;);</div><div class="code_line">*/</div><div class="code_line">&nbsp;&nbsp;return a+b-c;</div><div class="code_line">}</div></ol></div></div></div></div>Результат:<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">_foo:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pushl &nbsp; %ebp</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;%esp, %ebp</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pushl &nbsp; %edi</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pushl &nbsp; %esi</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pushl &nbsp; %ebx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;3, %eax</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;6, %edx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;9, %ebx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;8(%ebp), %esi</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;12(%ebp), %edi</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;16(%ebp), %ecx</div><div class="code_line">/APP</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;cld</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;rep movsl</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">/NO_APP</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;addl &nbsp; &nbsp;%edx, %eax</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;subl &nbsp; &nbsp;%ebx, %eax</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;popl &nbsp; &nbsp;%ebx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;popl &nbsp; &nbsp;%esi</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;popl &nbsp; &nbsp;%edi</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;popl &nbsp; &nbsp;%ebp</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ret</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;; ...</div><div class="code_line">_bar:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pushl &nbsp; %ebp</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;%esp, %ebp</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;3, %ecx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;6, %eax</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;9, %edx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;leal &nbsp; &nbsp;(%ecx,%eax), %eax</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;subl &nbsp; &nbsp;%edx, %eax</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;popl &nbsp; &nbsp;%ebp</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ret</div></ol></div></div></div></div>Во втором случае компилятор, не комплексуя, занял ecx под регистровую переменную, чтобы ни один из ebx, esi и edi, которые согласно ABI используются для регистровых переменных, не пришлось сохранять. Однако в первом случае предпочёл в этом нет смысла, т.к. ecx задействован в &quot;с&quot;, всё равно пушить/попить, поэтому заменил его на eax. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-04-16T16:48:43+00:00">16.04.20, 16:48</time></span></span><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">int foo(const void *src, void *dst, int count)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;register int a = 123, b = 456, c = 789,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; x = 321, y = 654, z = 987;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;asm volatile</div><div class="code_line">&nbsp;&nbsp;(</div><div class="code_line">&nbsp;&nbsp; &nbsp; &quot;cld\n\t&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &quot;rep movsl\n\t&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp; :</div><div class="code_line">&nbsp;&nbsp; &nbsp; : &quot;S&quot;(src), &quot;D&quot;(dst), &quot;c&quot;(count)</div><div class="code_line">&nbsp;&nbsp; &nbsp; : &quot;memory&quot;</div><div class="code_line">&nbsp;&nbsp;);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;return (a+b-c) / (x+y-z);</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">int bar(const void *src, void *dst, int count)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;register int a = 123, b = 456, c = 789,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; x = 321, y = 654, z = 987;</div><div class="code_line">&nbsp;</div><div class="code_line">/* &nbsp;asm volatile</div><div class="code_line">&nbsp;&nbsp;(</div><div class="code_line">&nbsp;&nbsp; &nbsp; &quot;cld\n\t&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &quot;rep movsl\n\t&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp; :</div><div class="code_line">&nbsp;&nbsp; &nbsp; : &quot;S&quot;(src), &quot;D&quot;(dst), &quot;c&quot;(count)</div><div class="code_line">&nbsp;&nbsp; &nbsp; : &quot;memory&quot;</div><div class="code_line">&nbsp;&nbsp;);*/</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;return (a+b-c) / (x+y-z);</div><div class="code_line">}</div></ol></div></div></div></div>Ну разве не красота<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">_foo:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pushl &nbsp; %ebp</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;%esp, %ebp</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pushl &nbsp; %edi</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pushl &nbsp; %esi</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pushl &nbsp; %ebx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;subl &nbsp; &nbsp;, %esp</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;3, %eax</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;6, %edx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;9, %ebx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;1, -16(%ebp)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;4, -20(%ebp)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;7, -24(%ebp)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;8(%ebp), %esi</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;12(%ebp), %edi</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;16(%ebp), %ecx</div><div class="code_line">/APP</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;cld</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;rep movsl</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">/NO_APP</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;leal &nbsp; &nbsp;(%eax,%edx), %edx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;subl &nbsp; &nbsp;%ebx, %edx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;-16(%ebp), %eax</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;addl &nbsp; &nbsp;-20(%ebp), %eax</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;subl &nbsp; &nbsp;-24(%ebp), %eax</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;%eax, -28(%ebp)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;%edx, %eax</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;cltd</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;idivl &nbsp; -28(%ebp)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;%eax, -28(%ebp)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;-28(%ebp), %eax</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;addl &nbsp; &nbsp;, %esp</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;popl &nbsp; &nbsp;%ebx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;popl &nbsp; &nbsp;%esi</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;popl &nbsp; &nbsp;%edi</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;popl &nbsp; &nbsp;%ebp</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ret</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;; ...</div><div class="code_line">&nbsp;</div><div class="code_line">_bar:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pushl &nbsp; %ebp</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;%esp, %ebp</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pushl &nbsp; %edi</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pushl &nbsp; %esi</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pushl &nbsp; %ebx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;subl &nbsp; &nbsp;, %esp</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;3, %edx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;6, %eax</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;9, %ecx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;1, %ebx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;4, %esi</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;7, %edi</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;addl &nbsp; &nbsp;%eax, %edx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;subl &nbsp; &nbsp;%ecx, %edx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;leal &nbsp; &nbsp;(%ebx,%esi), %eax</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;subl &nbsp; &nbsp;%edi, %eax</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;%eax, -16(%ebp)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;%edx, %eax</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;cltd</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;idivl &nbsp; -16(%ebp)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;%eax, -16(%ebp)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;-16(%ebp), %eax</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;addl &nbsp; &nbsp;, %esp</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;popl &nbsp; &nbsp;%ebx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;popl &nbsp; &nbsp;%esi</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;popl &nbsp; &nbsp;%edi</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;popl &nbsp; &nbsp;%ebp</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ret</div></ol></div></div></div></div>Вторая функция легко заняла все шесть доступных регистров. Правда, пришлось обеспокоиться ebx, esi и edi, но, видать, с точки зрения оптимизатора это окупилось. Но вот в первой оптимизатор решил, что не окупится, и разместил x, y и z на стеке. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-04-16T16:51:18+00:00">16.04.20, 16:51</time></span></span><br>
Как видишь, не надо компилятору указывать то, о чём он и так в курсе.]]></description>
        <author>Qraizer</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=418165&amp;view=findpost&amp;p=3828661</guid>
        <pubDate>Thu, 16 Apr 2020 16:29:30 +0000</pubDate>
        <title>Scratch registers в asm-вставке GCC</title>
        <link>https://forum.sources.ru/index.php?showtopic=418165&amp;view=findpost&amp;p=3828661</link>
        <description><![CDATA[Qraizer: Я отнюдь не профи в этом синтаксисе, но кое-как разобрал ситуацию и пришёл к выводу, что тут клобберсов не нужно. Смотри, мож где наглючил, так что проверяй.<ul class="tag-list"><li>В аутпутах у нас пусто, потому что возвращать из asm нечего. Точнее, ничего не надо.</li><li>В инпутах нужно указать, откуда берутся три параметра для строковой инструкции с повторителем.</li><li>В клоберсах нужно указать то, о чём компилятор не может знать, т.б. что меняется память. Тот факт, что esi, edi и ecx тоже меняются, компилятору и без нас известно посредством &quot;S&quot;, &quot;D&quot; и &quot;c&quot;.</li></ul>Итого, что-то типа:<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">int foo(const void *src, void *dst, int count)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;asm volatile</div><div class="code_line">&nbsp;&nbsp;(</div><div class="code_line">&nbsp;&nbsp; &nbsp;&quot;cld\n\t&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp;&quot;rep movsl\n\t&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp;: </div><div class="code_line">&nbsp;&nbsp; &nbsp;: &quot;S&quot;(src), &quot;D&quot;(dst), &quot;c&quot;(count)</div><div class="code_line">&nbsp;&nbsp; &nbsp;: &quot;memory&quot;</div><div class="code_line">&nbsp;&nbsp;);</div><div class="code_line">}</div></ol></div></div></div></div>Результат:<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">_foo:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pushl &nbsp; %ebp</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;%esp, %ebp</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pushl &nbsp; %edi</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pushl &nbsp; %esi</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;8(%ebp), %esi</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;12(%ebp), %edi</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movl &nbsp; &nbsp;16(%ebp), %ecx</div><div class="code_line">/APP</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;cld</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;rep movsl</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">/NO_APP</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;popl &nbsp; &nbsp;%esi</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;popl &nbsp; &nbsp;%edi</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;popl &nbsp; &nbsp;%ebp</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ret</div></ol></div></div></div></div>]]></description>
        <author>Qraizer</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=418165&amp;view=findpost&amp;p=3828499</guid>
        <pubDate>Tue, 14 Apr 2020 22:24:09 +0000</pubDate>
        <title>Scratch registers в asm-вставке GCC</title>
        <link>https://forum.sources.ru/index.php?showtopic=418165&amp;view=findpost&amp;p=3828499</link>
        <description><![CDATA[Jin X: <strong class='tag-b'>Qraizer</strong>, приведённый пример не подходит. Там указывается &quot;+D&quot; в output&#39;е, потому что это значение нужно и прочитать, и записать. А мне записывать результат никуда не нужно. С параметром &quot;=c&quot; (и далее &quot;0&quot;) аналогично. А параметр &quot;a&quot; не меняется вообще.<br>
Я же спрашиваю про ситуацию, когда нужно прочитать, изменить, но результат никуда записывать не надо.<br>
<br>
Кроме того, я не понимаю, зачем там вообще используется параметр <strong class='tag-b'>&quot;m&quot; (*(const char (*)[]) p)</strong>. Для чего он нужен, ты понимаешь?<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">&nbsp;&nbsp;void *dummy1, *dummy2, *dummy3</div><div class="code_line">&nbsp;&nbsp;asm volatile(</div><div class="code_line">&nbsp;&nbsp; &nbsp;&quot;cld\n\t&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp;&quot;rep movsl\n\t&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp;: &quot;=S&quot;(dummy1), &quot;=D&quot;(dummy2), &quot;=c&quot;(dummy3)</div><div class="code_line">&nbsp;&nbsp; &nbsp;: &quot;S&quot;(src), &quot;D&quot;(dst), &quot;c&quot;(count)</div><div class="code_line">&nbsp;&nbsp;);</div></ol></div></div></div></div>Компилятор соптимизирует этот код и записывать в dummy* ничего не будет (при -O1 и выше).<br>
Но код становится не очень красивым в итоге.<br>
<br>
Я не понимаю, почему нельзя было разрешить указывать в clobbers параметры input. Очень странно, конечно. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-04-14T22:38:31+00:00">14.04.20, 22:38</time></span></span><br>
И в примере с <strong class='tag-b'>sumsq</strong> я не могу уловить смысл дублирования x и y: <strong class='tag-b'>&quot;m&quot; (*x), &quot;m&quot; (*y)</strong>. Прочитал несколько раз, но всё равно не доходит.]]></description>
        <author>Jin X</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=418165&amp;view=findpost&amp;p=3828490</guid>
        <pubDate>Tue, 14 Apr 2020 19:29:51 +0000</pubDate>
        <title>Scratch registers в asm-вставке GCC</title>
        <link>https://forum.sources.ru/index.php?showtopic=418165&amp;view=findpost&amp;p=3828490</link>
        <description><![CDATA[Qraizer: Ну там же ниже приведён пример для &quot;An x86 example where the string memory argument is of unknown length.&quot; для repne scasb Чем не устроил? И вообще, оно надо-то?]]></description>
        <author>Qraizer</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=418165&amp;view=findpost&amp;p=3828414</guid>
        <pubDate>Mon, 13 Apr 2020 20:58:12 +0000</pubDate>
        <title>Scratch registers в asm-вставке GCC</title>
        <link>https://forum.sources.ru/index.php?showtopic=418165&amp;view=findpost&amp;p=3828414</link>
        <description><![CDATA[Jin X: Подскажите, как указать в асм-вставке GCC, что входной регистр изменяется?<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;&nbsp;asm volatile(</div><div class="code_line">&nbsp;&nbsp; &nbsp;&quot;cld\n\t&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp;&quot;rep movsl\n\t&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp;:</div><div class="code_line">&nbsp;&nbsp; &nbsp;: &quot;S&quot;(src), &quot;D&quot;(dst), &quot;c&quot;(count)</div><div class="code_line">&nbsp;&nbsp;);</div></ol></div></div></div></div>Я не могу прописать &quot;esi&quot;, &quot;edi&quot;, &quot;ecx&quot; в списке clobbers, что делать-то?<br>
<br>
В <a class='tag-url' href='https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html#Clobbers-and-Scratch-Registers' target='_blank'>доке</a> пишут, что нет способа указать, что входной регистр изменяется, если не указать его в списке выходных параметров.<br>
Но что мне там указывать? Я же не могу написать в списке выходных параметров просто &quot;=S&quot;, &quot;=D&quot;, &quot;=c&quot; без скобок или с пустыми скобками.<br>
<br>
Есть такие мысли только:<br>
1. Указывать во входных просто &quot;r&quot; и в асме писать <strong class='tag-b'>mov %0, %%esi</strong> и т.д. Но это тоже как-то тупо (лишние пересылки туда-сюда, и кстати, не факт, что получится, может тупо не хватить регистров, если их будет больше, чем 3).<br>
2. Сохранить и восстановить эти регистры (<strong class='tag-b'>push</strong>/<strong class='tag-b'>pop</strong>) внутри асм-вставки, но это тоже лишние танцы с бубном.<br>
<br>
И тут ещё один вопрос рождается: если я указал в clobbers callee-save регистры, мне же не нужно их сохранять/восстанавливать, верно (точнее говоря, я надеюсь), компилятор сделает это сам?]]></description>
        <author>Jin X</author>
        <category>Assembler</category>
      </item>
	
      </channel>
      </rss>
	