📄 42.html
字号:
<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 <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 > 串2,则返回1;串1 = 串2,则返回0;串1 < 串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 字符<串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 > 串2,则返回1;串1 = 串2,则返回0;串1 < 串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<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 字符<串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 + -