<?xml version="1.0" encoding="koi8-r"?>
<rss version="0.91">
<channel>
    <title>OpenForum RSS: GCC Accemбляр </title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8566.html</link>
    <description>#define swap(a, b) __asm__ __volatile__ (&#092;&lt;br&gt;                   &quot;xchg &#037;0, &#037;1&quot;     &#092;&lt;br&gt;      : &quot;=r&quot;(a), &quot;=r&quot;(b) &#092;&lt;br&gt;      :  &quot;r&quot;(b), &quot;r&quot;(a)); /* Правильно ли? */&lt;br&gt;&lt;br&gt;int main(void)&lt;br&gt; &#123;&lt;br&gt;   char a = &apos;X&apos;;&lt;br&gt;   char b = &apos;Z&apos;;&lt;br&gt;&lt;br&gt;   swap(a,b);&lt;br&gt;  &lt;br&gt;  printf(&quot;&#037;s, &#037;s&#092;n&quot;, a, b);&lt;br&gt;&lt;br&gt; return(0);&lt;br&gt;&#125;&lt;br&gt;&lt;br&gt;Собственно, работает, но мучают меня сомнения, &lt;br&gt;по поводу строки - : &quot;r&quot;(b), &quot;r&quot;(a));&lt;br&gt;&lt;br&gt;Получается, что я сам поменял местами (a) и (b), &lt;br&gt;а не операция xchg,... или я чёй-то не вкурю...&lt;br&gt; &lt;br&gt;</description>

<item>
    <title>GCC Accemбляр  (const86)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8566.html#5</link>
    <pubDate>Tue, 22 Dec 2009 12:27:51 GMT</pubDate>
    <description>&amp;gt;&amp;gt;!  __asm__ __volatile__ (&quot;xchg &#037;eax, &#037;&#037;eсx&quot; : &quot;=a&quot;(x), &quot;=с&quot;(y) : &quot;a&quot;(x), &quot;с&quot;(y));&lt;br&gt;&amp;gt;&amp;gt;...&lt;br&gt;&amp;gt;&amp;gt;main+31: xchg   &#037;eax,&#037;edx &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;Чудеса... </description>
</item>

<item>
    <title>GCC Accemбляр  (const86)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8566.html#4</link>
    <pubDate>Tue, 22 Dec 2009 12:27:06 GMT</pubDate>
    <description>&amp;gt;!  __asm__ __volatile__ (&quot;xchg &#037;Йx, &#037;&#037;eсx&quot; : &quot;=a&quot;(x), &quot;=с&quot;(y) : &quot;a&quot;(x), &quot;с&quot;(y));&lt;br&gt;&amp;gt;...&lt;br&gt;&amp;gt;main+31: xchg   Йx,Мx &lt;br&gt;&lt;br&gt;Чудеса...&lt;br&gt;</description>
</item>

<item>
    <title>GCC Accemбляр  (pavlinux)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8566.html#3</link>
    <pubDate>Tue, 22 Dec 2009 11:49:56 GMT</pubDate>
    <description>&amp;gt;Мне не нравится, что в списке переменных asm четыре переменных, а в &lt;br&gt;&lt;br&gt;Почаму 4, две x, y:  x = -4(&#037;rbp),  y = -8(&#037;rbp) &lt;br&gt;&lt;br&gt;&amp;gt;коде ссылка только на две. Не знаю, как это исправить, пользуясь &lt;br&gt;&amp;gt;автоматическим выбором регистра. Я бы написал явно, примерно так: &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;void hyperswap(int *p, int *q) &#123; &lt;br&gt;&amp;gt; int x = *p, y = *q; &lt;br&gt;&amp;gt; asm (&quot;xchg &#037;&#037;eax, &#037;&#037;ecx&#092;n&quot; : &quot;=a&quot; (x), &quot;=c&quot; (y) : &quot;a&quot; &lt;br&gt;&amp;gt;(x), &quot;c&quot; (y)); &lt;br&gt;&amp;gt; *p = x, *q = y; &lt;br&gt;&amp;gt;&#125; &lt;br&gt;&lt;br&gt;У меня всё равно пихается в EDX, и появляется лишний mov &lt;br&gt;&lt;br&gt;!&lt;br&gt;!  __asm__ __volatile__ (&quot;xchg &#037;&#037;eax, &#037;&#037;eсx&quot; : &quot;=a&quot;(x), &quot;=с&quot;(y) : &quot;a&quot;(x), &quot;с&quot;(y));&lt;br&gt;main+22: mov    -0x8(&#037;rbp),&#037;eax&lt;br&gt;main+25: mov    -0x4(&#037;rbp),&#037;eсx&lt;br&gt;main+28: mov    &#037;eсx, &#037;edx         :)&lt;br&gt;main+31: xchg   &#037;eax,&#037;edx&lt;br&gt;main+32: mov    &#037;eax,-0x8(&#037;rbp)&lt;br&gt;main+33: mov    &#037;edx,-0x4(&#037;rbp)&lt;br&gt;! &lt;br&gt;&lt;br&gt;Вот так работат. &lt;br&gt;&lt;br&gt;__asm__ __volatile__ (&quot;xchg &#037;&#037;eax, &#037;&#037;edx&quot; : &quot;=a&quot;(x), &quot;=d&quot;(y) : &quot;a&quot;(x), &quot;d&quot;(y));&lt;br&gt;</description>
</item>

<item>
    <title>GCC Accemбляр  (const86)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8566.html#2</link>
    <pubDate>Tue, 22 Dec 2009 07:44:00 GMT</pubDate>
    <description>&amp;gt;        xchg    &#037;edx, &#037;eax      # собственно команда &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;        movl    &#037;edx, -8(&#037;rbp)  # пихнуть edx в b &lt;br&gt;&amp;gt;        movl    &#037;eax, -4(&#037;rbp)  # и eax в a &lt;br&gt;&lt;br&gt;Красота! А если убрать асм и сделать старым дедушкиным методом с временной переменной, то компилятор сделает те же два movl, только поменяет edx и eax - и xchg вапще нинужен!&lt;br&gt;&lt;br&gt;Мне не нравится, что в списке переменных asm четыре переменных, а в коде ссылка только на две. Не знаю, как это исправить, пользуясь автоматическим выбором регистра. Я бы написал явно, примерно так:&lt;br&gt;&lt;br&gt;void hyperswap(int *p, int *q) &#123;&lt;br&gt;int x = *p, y = *q;&lt;br&gt;asm (&quot;xchg &#037;&#037;eax, &#037;&#037;ecx&#092;n&quot; : &quot;=a&quot; (x), &quot;=c&quot; (y) : &quot;a&quot; (x), &quot;c&quot; (y));&lt;br&gt;*p = x, *q = y;&lt;br&gt;&#125;&lt;br&gt;</description>
</item>

<item>
    <title>GCC Accemбляр  (pavlinux)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8566.html#1</link>
    <pubDate>Tue, 22 Dec 2009 01:00:01 GMT</pubDate>
    <description>&amp;gt;#define swap(a, b) __asm__ __volatile__ (&#092; &lt;br&gt;&amp;gt;            &lt;br&gt;&amp;gt;       &quot;xchg &#037;0, &#037;1&quot;  &lt;br&gt;&amp;gt;   &#092; &lt;br&gt;&amp;gt;        : &quot;=r&quot;(a), &quot;=r&quot;(b) &#092; &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;        :  &quot;r&quot;(b), &quot;r&quot;(a)); &lt;br&gt;&lt;br&gt;Дизассм сказал: &lt;br&gt;&lt;br&gt;Как я понимаю&lt;br&gt;        movl    -4(&#037;rbp), &#037;eax  # это a = &apos;X&apos;;&lt;br&gt;        movl    -8(&#037;rbp), &#037;edx  # это b = &apos;Z&apos;;&lt;br&gt;&lt;br&gt;        xchg    &#037;edx, &#037;eax      # собственно команда&lt;br&gt;&lt;br&gt;        movl    &#037;edx, -8(&#037;rbp)  # пихнуть edx в b  &lt;br&gt;        movl    &#037;eax, -4(&#037;rbp)  # и eax в a &lt;br&gt;&lt;br&gt;Так? &lt;br&gt;&lt;br&gt;</description>
</item>

</channel>
</rss>
