⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 42.html

📁 linux 0.11中文版 有注释
💻 HTML
📖 第 1 页 / 共 4 页
字号:
<a name='L101'>           "1:\tdecl %3\n\t"    <i><font color='green'>// ecx--(从0 开始计数)。</font></i>
<a name='L102'>           "js 2f\n\t"          <i><font color='green'>// ecx &lt;0 ?,是则向前跳转到标号2 处。</font></i>
<a name='L103'>           "lodsb\n\t"          <i><font color='green'>// 否则取ds:[esi]处的字节??al,esi++。</font></i>
<a name='L104'>           "stosb\n\t"          <i><font color='green'>// 存储到es:[edi]处,edi++。</font></i>
<a name='L105'>           "testb %%al,%%al\n\t"        <i><font color='green'>// 该字节值为0?</font></i>
<a name='L106'>           "jne 1b\n"           <i><font color='green'>// 不是则向后跳转到标号1 处,继续复制。</font></i>
<a name='L107'>           "2:\txorl %2,%2\n\t" <i><font color='green'>// 将al 清零。</font></i>
<a name='L108'>           "stosb"              <i><font color='green'>// 存到es:[edi]处。</font></i>
<a name='L109'>::"S" (src), "D" (dest), "a" (0), "c" (0xffffffff), "g" (<a href='../D/738.html' title='Multiple defined in 17 places.'>count</a>):"si", "di", "ax",
<a name='L110'>           "cx");
<a name='L111'>  <b>return</b> dest;                  <i><font color='green'>// 返回目的字符串指针。</font></i>
<a name='L112'><font color='red'>}</font>
<a name='L113'>
<a name='L114'><i><font color='green'>//// 将一个字符串与另一个字符串进行比较。</font></i>
<a name='L115'><i><font color='green'>// 参数:cs - 字符串1,ct - 字符串2。</font></i>
<a name='L116'><i><font color='green'>// %0 - eax(__res)返回值,%1 - edi(cs)字符串1 指针,%2 - esi(ct)字符串2 指针。</font></i>
<a name='L117'><i><font color='green'>// 返回:如果串1 &gt; 串2,则返回1;串1 = 串2,则返回0;串1 &lt; 串2,则返回-1。</font></i>
<a name='L118'><b>extern</b> <b>inline</b> <b>int</b>
<a name='L119'><a href='../R/620.html' title='Multiple refered from 2 places.'>strcmp</a> (<b>const</b> <b>char</b> *cs, <b>const</b> <b>char</b> *ct)
<a name='L120'><font color='red'>{</font>
<a name='L121'>  <b>register</b> <b>int</b> __res <b>__asm__</b> ("ax");    <i><font color='green'>// __res 是寄存器变量(eax)。</font></i>
<a name='L122'>  <b>__asm__</b> ("cld\n"              <i><font color='green'>// 清方向位。</font></i>
<a name='L123'>           "1:\tlodsb\n\t"      <i><font color='green'>// 取字符串2 的字节ds:[esi]??al,并且esi++。</font></i>
<a name='L124'>           "scasb\n\t"          <i><font color='green'>// al 与字符串1 的字节es:[edi]作比较,并且edi++。</font></i>
<a name='L125'>           "jne 2f\n\t"         <i><font color='green'>// 如果不相等,则向前跳转到标号2。</font></i>
<a name='L126'>           "testb %%al,%%al\n\t"        <i><font color='green'>// 该字节是0 值字节吗(字符串结尾)?</font></i>
<a name='L127'>           "jne 1b\n\t"         <i><font color='green'>// 不是,则向后跳转到标号1,继续比较。</font></i>
<a name='L128'>           "xorl %%eax,%%eax\n\t"       <i><font color='green'>// 是,则返回值eax 清零,</font></i>
<a name='L129'>           "jmp 3f\n"           <i><font color='green'>// 向前跳转到标号3,结束。</font></i>
<a name='L130'>           "2:\tmovl $1,%%eax\n\t"      <i><font color='green'>// eax 中置1。</font></i>
<a name='L131'>           "jl 3f\n\t"          <i><font color='green'>// 若前面比较中串2 字符&lt;串1 字符,则返回正值,结束。</font></i>
<a name='L132'>           "negl %%eax\n"       <i><font color='green'>// 否则eax = -eax,返回负值,结束。</font></i>
<a name='L133'>"3:": "=a" (__res): "D" (cs), "S" (ct):"si", "di");
<a name='L134'>  <b>return</b> __res;                 <i><font color='green'>// 返回比较结果。</font></i>
<a name='L135'><font color='red'>}</font>
<a name='L136'>
<a name='L137'><i><font color='green'>//// 字符串1 与字符串2 的前count 个字符进行比较。</font></i>
<a name='L138'><i><font color='green'>// 参数:cs - 字符串1,ct - 字符串2,count - 比较的字符数。</font></i>
<a name='L139'><i><font color='green'>// %0 - eax(__res)返回值,%1 - edi(cs)串1 指针,%2 - esi(ct)串2 指针,%3 - ecx(count)。</font></i>
<a name='L140'><i><font color='green'>// 返回:如果串1 &gt; 串2,则返回1;串1 = 串2,则返回0;串1 &lt; 串2,则返回-1。</font></i>
<a name='L141'><b>extern</b> <b>inline</b> <b>int</b>
<a name='L142'>strncmp (<b>const</b> <b>char</b> *cs, <b>const</b> <b>char</b> *ct, <b>int</b> count)
<a name='L143'><font color='red'>{</font>
<a name='L144'>  <b>register</b> <b>int</b> __res <b>__asm__</b> ("ax");    <i><font color='green'>// __res 是寄存器变量(eax)。</font></i>
<a name='L145'>  <b>__asm__</b> ("cld\n"              <i><font color='green'>// 清方向位。</font></i>
<a name='L146'>           "1:\tdecl %3\n\t"    <i><font color='green'>// count--。</font></i>
<a name='L147'>           "js 2f\n\t"          <i><font color='green'>// 如果count&lt;0,则向前跳转到标号2。</font></i>
<a name='L148'>           "lodsb\n\t"          <i><font color='green'>// 取串2 的字符ds:[esi]??al,并且esi++。</font></i>
<a name='L149'>           "scasb\n\t"          <i><font color='green'>// 比较al 与串1 的字符es:[edi],并且edi++。</font></i>
<a name='L150'>           "jne 3f\n\t"         <i><font color='green'>// 如果不相等,则向前跳转到标号3。</font></i>
<a name='L151'>           "testb %%al,%%al\n\t"        <i><font color='green'>// 该字符是NULL 字符吗?</font></i>
<a name='L152'>           "jne 1b\n"           <i><font color='green'>// 不是,则向后跳转到标号1,继续比较。</font></i>
<a name='L153'>           "2:\txorl %%eax,%%eax\n\t"   <i><font color='green'>// 是NULL 字符,则eax 清零(返回值)。</font></i>
<a name='L154'>           "jmp 4f\n"           <i><font color='green'>// 向前跳转到标号4,结束。</font></i>
<a name='L155'>           "3:\tmovl $1,%%eax\n\t"      <i><font color='green'>// eax 中置1。</font></i>
<a name='L156'>           "jl 4f\n\t"          <i><font color='green'>// 如果前面比较中串2 字符&lt;串2 字符,则返回1,结束。</font></i>
<a name='L157'>           "negl %%eax\n"       <i><font color='green'>// 否则eax = -eax,返回负值,结束。</font></i>
<a name='L158'>"4:": "=a" (__res): "D" (cs), "S" (ct), "c" (<a href='../D/738.html' title='Multiple defined in 17 places.'>count</a>):"si", "di",
<a name='L159'>           "cx");
<a name='L160'>  <b>return</b> __res;                 <i><font color='green'>// 返回比较结果。</font></i>
<a name='L161'><font color='red'>}</font>
<a name='L162'>
<a name='L163'><i><font color='green'>//// 在字符串中寻找第一个匹配的字符。</font></i>
<a name='L164'><i><font color='green'>// 参数:s - 字符串,c - 欲寻找的字符。</font></i>
<a name='L165'><i><font color='green'>// %0 - eax(__res),%1 - esi(字符串指针s),%2 - eax(字符c)。</font></i>
<a name='L166'><i><font color='green'>// 返回:返回字符串中第一次出现匹配字符的指针。若没有找到匹配的字符,则返回空指针。</font></i>
<a name='L167'><b>extern</b> <b>inline</b> <b>char</b> *
<a name='L168'><a href='../S/8.html#L370' title='Refered from 370 in fs/exec.c.'>strchr</a> (<b>const</b> <b>char</b> *s, <b>char</b> c)
<a name='L169'><font color='red'>{</font>
<a name='L170'>  <b>register</b> <b>char</b> *__res <b>__asm__</b> ("ax");  <i><font color='green'>// __res 是寄存器变量(eax)。</font></i>
<a name='L171'>  <b>__asm__</b> ("cld\n\t"            <i><font color='green'>// 清方向位。</font></i>
<a name='L172'>           "movb %%al,%%ah\n"   <i><font color='green'>// 将欲比较字符移到ah。</font></i>
<a name='L173'>           "1:\tlodsb\n\t"      <i><font color='green'>// 取字符串中字符ds:[esi]??al,并且esi++。</font></i>
<a name='L174'>           "cmpb %%ah,%%al\n\t" <i><font color='green'>// 字符串中字符al 与指定字符ah 相比较。</font></i>
<a name='L175'>           "je 2f\n\t"          <i><font color='green'>// 若相等,则向前跳转到标号2 处。</font></i>
<a name='L176'>           "testb %%al,%%al\n\t"        <i><font color='green'>// al 中字符是NULL 字符吗?(字符串结尾?)</font></i>
<a name='L177'>           "jne 1b\n\t"         <i><font color='green'>// 若不是,则向后跳转到标号1,继续比较。</font></i>
<a name='L178'>           "movl $1,%1\n"       <i><font color='green'>// 是,则说明没有找到匹配字符,esi 置1。</font></i>
<a name='L179'>           "2:\tmovl %1,%0\n\t" <i><font color='green'>// 将指向匹配字符后一个字节处的指针值放入eax</font></i>
<a name='L180'>           "decl %0"            <i><font color='green'>// 将指针调整为指向匹配的字符。</font></i>
<a name='L181'>: "=a" (__res): "S" (s), "" (c):"si");
<a name='L182'>  <b>return</b> __res;                 <i><font color='green'>// 返回指针。</font></i>
<a name='L183'><font color='red'>}</font>
<a name='L184'>
<a name='L185'><i><font color='green'>//// 寻找字符串中指定字符最后一次出现的地方。(反向搜索字符串)</font></i>
<a name='L186'><i><font color='green'>// 参数:s - 字符串,c - 欲寻找的字符。</font></i>
<a name='L187'><i><font color='green'>// %0 - edx(__res),%1 - edx(0),%2 - esi(字符串指针s),%3 - eax(字符c)。</font></i>
<a name='L188'><i><font color='green'>// 返回:返回字符串中最后一次出现匹配字符的指针。若没有找到匹配的字符,则返回空指针。</font></i>
<a name='L189'><b>extern</b> <b>inline</b> <b>char</b> *
<a name='L190'>strrchr (<b>const</b> <b>char</b> *s, <b>char</b> c)
<a name='L191'><font color='red'>{</font>
<a name='L192'>  <b>register</b> <b>char</b> *__res <b>__asm__</b> ("dx");  <i><font color='green'>// __res 是寄存器变量(edx)。</font></i>
<a name='L193'>  <b>__asm__</b> ("cld\n\t"            <i><font color='green'>// 清方向位。</font></i>
<a name='L194'>           "movb %%al,%%ah\n"   <i><font color='green'>// 将欲寻找的字符移到ah。</font></i>
<a name='L195'>           "1:\tlodsb\n\t"      <i><font color='green'>// 取字符串中字符ds:[esi]??al,并且esi++。</font></i>
<a name='L196'>           "cmpb %%ah,%%al\n\t" <i><font color='green'>// 字符串中字符al 与指定字符ah 作比较。</font></i>
<a name='L197'>           "jne 2f\n\t"         <i><font color='green'>// 若不相等,则向前跳转到标号2 处。</font></i>
<a name='L198'>           "movl %%esi,%0\n\t"  <i><font color='green'>// 将字符指针保存到edx 中。</font></i>
<a name='L199'>           "decl %0\n"          <i><font color='green'>// 指针后退一位,指向字符串中匹配字符处。</font></i>
<a name='L200'>           "2:\ttestb %%al,%%al\n\t"    <i><font color='green'>// 比较的字符是0 吗(到字符串尾)?</font></i>
<a name='L201'>           "jne 1b"             <i><font color='green'>// 不是则向后跳转到标号1 处,继续比较。</font></i>
<a name='L202'>: "=d" (__res): "" (0), "S" (s), "a" (c):"ax", "si");
<a name='L203'>  <b>return</b> __res;                 <i><font color='green'>// 返回指针。</font></i>
<a name='L204'><font color='red'>}</font>
<a name='L205'>
<a name='L206'><i><font color='green'>//// 在字符串1 中寻找第1 个字符序列,该字符序列中的任何字符都包含在字符串2 中。</font></i>
<a name='L207'><i><font color='green'>// 参数:cs - 字符串1 指针,ct - 字符串2 指针。</font></i>
<a name='L208'><i><font color='green'>// %0 - esi(__res),%1 - eax(0),%2 - ecx(-1),%3 - esi(串1 指针cs),%4 - (串2 指针ct)。</font></i>
<a name='L209'><i><font color='green'>// 返回字符串1 中包含字符串2 中任何字符的首个字符序列的长度值。</font></i>
<a name='L210'><b>extern</b> <b>inline</b> <b>int</b>
<a name='L211'>strspn (<b>const</b> <b>char</b> *cs, <b>const</b> <b>char</b> *ct)
<a name='L212'><font color='red'>{</font>
<a name='L213'>  <b>register</b> <b>char</b> *__res <b>__asm__</b> ("si");  <i><font color='green'>// __res 是寄存器变量(esi)。</font></i>
<a name='L214'>  <b>__asm__</b> ("cld\n\t"            <i><font color='green'>// 清方向位。</font></i>
<a name='L215'>           "movl %4,%%edi\n\t"  <i><font color='green'>// 首先计算串2 的长度。串2 指针放入edi 中。</font></i>
<a name='L216'>           "repne\n\t"          <i><font color='green'>// 比较al(0)与串2 中的字符(es:[edi]),并edi++。</font></i>
<a name='L217'>           "scasb\n\t"          <i><font color='green'>// 如果不相等就继续比较(ecx 逐步递减)。</font></i>
<a name='L218'>           "notl %%ecx\n\t"     <i><font color='green'>// ecx 中每位取反。</font></i>
<a name='L219'>           "decl %%ecx\n\t"     <i><font color='green'>// ecx--,得串2 的长度值。</font></i>
<a name='L220'>           "movl %%ecx,%%edx\n" <i><font color='green'>// 将串2 的长度值暂放入edx 中。</font></i>
<a name='L221'>           "1:\tlodsb\n\t"      <i><font color='green'>// 取串1 字符ds:[esi]??al,并且esi++。</font></i>
<a name='L222'>           "testb %%al,%%al\n\t"        <i><font color='green'>// 该字符等于0 值吗(串1 结尾)?</font></i>
<a name='L223'>           "je 2f\n\t"          <i><font color='green'>// 如果是,则向前跳转到标号2 处。</font></i>
<a name='L224'>           "movl %4,%%edi\n\t"  <i><font color='green'>// 取串2 头指针放入edi 中。</font></i>
<a name='L225'>           "movl %%edx,%%ecx\n\t"       <i><font color='green'>// 再将串2 的长度值放入ecx 中。</font></i>
<a name='L226'>           "repne\n\t"          <i><font color='green'>// 比较al 与串2 中字符es:[edi],并且edi++。</font></i>
<a name='L227'>           "scasb\n\t"          <i><font color='green'>// 如果不相等就继续比较。</font></i>
<a name='L228'>           "je 1b\n"            <i><font color='green'>// 如果相等,则向后跳转到标号1 处。</font></i>
<a name='L229'>           "2:\tdecl %0"        <i><font color='green'>// esi--,指向最后一个包含在串2 中的字符。</font></i>
<a name='L230'>: "=S" (__res): "a" (0), "c" (0xffffffff), "" (cs), "g" (ct):"ax", "cx", "dx",
<a name='L231'>           "di");
<a name='L232'>  <b>return</b> __res - cs;            <i><font color='green'>// 返回字符序列的长度值。</font></i>
<a name='L233'><font color='red'>}</font>
<a name='L234'>
<a name='L235'><i><font color='green'>//// 寻找字符串1 中不包含字符串2 中任何字符的首个字符序列。</font></i>
<a name='L236'><i><font color='green'>// 参数:cs - 字符串1 指针,ct - 字符串2 指针。</font></i>
<a name='L237'><i><font color='green'>// %0 - esi(__res),%1 - eax(0),%2 - ecx(-1),%3 - esi(串1 指针cs),%4 - (串2 指针ct)。</font></i>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -