<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>汇编 on kamuszhou&#39;s blog</title>
    <link>https://ykyi.net/tags/%E6%B1%87%E7%BC%96/</link>
    <description>Recent content in 汇编 on kamuszhou&#39;s blog</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Sun, 17 Feb 2013 12:32:07 +0000</lastBuildDate>
    <atom:link href="https://ykyi.net/tags/%E6%B1%87%E7%BC%96/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>GCC内联汇编写的memcmp函数 for x86-64</title>
      <link>https://ykyi.net/?p=933/</link>
      <pubDate>Sun, 17 Feb 2013 12:32:07 +0000</pubDate>
      <guid>https://ykyi.net/?p=933/</guid>
      <description>&lt;p&gt;今天写内核代码时要写一个比较两个页框(Page Frame)的函数，想到用内联汇编来写这个功能。下面是代码：&lt;/p&gt;
&lt;p&gt;long cmp_x64(void *s1, void *s2, size_t n)&lt;br&gt;
{&lt;br&gt;
    size_t num = n / 8;&lt;br&gt;
    register long res;&lt;/p&gt;
&lt;p&gt;    __asm__ __volatile__&lt;br&gt;
    (&lt;br&gt;
     &amp;ldquo;testq %3,%3\n\t&amp;rdquo;               ; 测试num是不是0&lt;br&gt;
     &amp;ldquo;repe  cmpsq\n\t&amp;rdquo;                ; 不停地比较直到cx寄存器为0或比较到差别&lt;br&gt;
     &amp;ldquo;je        1f\n\t&amp;rdquo;              ; 两块内存相等，跳出，返回0.&lt;br&gt;
     &amp;ldquo;sbbq      %0,%0\n\t&amp;rdquo;    ; sbb是x86的减法指令，会额外地减去CF(借位)的值，这样%0就会是0或者-1&lt;br&gt;
     &amp;ldquo;orq       $1,%0\n&amp;rdquo;         ; 把立即数1或到%0上，这样%0就会是1或者-1.&lt;br&gt;
     &amp;ldquo;1:&amp;rdquo;&lt;br&gt;
         : &amp;ldquo;=&amp;amp;a&amp;rdquo;(res)          ;  传入变量res放入寄存器ax，且这个变量是输出值(=)，不要与其它输入输出共用寄存器(&amp;amp;)&lt;br&gt;
     : &amp;ldquo;0&amp;rdquo;(res), &amp;ldquo;S&amp;rdquo;(s1), &amp;ldquo;D&amp;rdquo;(s2), &amp;ldquo;c&amp;rdquo;(num)  ; 输入列表&lt;br&gt;
     : &amp;ldquo;cc&amp;rdquo;);           // clobber list 告诉gcc在这段内联汇编中哪些寄存器被显式/隐式修改.&lt;span style=&#34;color: rgb(0, 0, 0); font-family: &#39;Times New Roman&#39;; font-size: medium; line-height: normal;&#34;&gt;If our instruction can alter the condition code register, we have to add &amp;ldquo;cc&amp;rdquo; to the list of clobbered registers.&lt;/span&gt;&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
