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

📄 42.html

📁 linux 0.11中文版 有注释
💻 HTML
📖 第 1 页 / 共 4 页
字号:
<a name='L238'><i><font color='green'>// 返回字符串1 中不包含字符串2 中任何字符的首个字符序列的长度值。</font></i>
<a name='L239'><b>extern</b> <b>inline</b> <b>int</b>
<a name='L240'>strcspn (<b>const</b> <b>char</b> *cs, <b>const</b> <b>char</b> *ct)
<a name='L241'><font color='red'>{</font>
<a name='L242'>  <b>register</b> <b>char</b> *__res <b>__asm__</b> ("si");  <i><font color='green'>// __res 是寄存器变量(esi)。</font></i>
<a name='L243'>  <b>__asm__</b> ("cld\n\t"            <i><font color='green'>// 清方向位。</font></i>
<a name='L244'>           "movl %4,%%edi\n\t"  <i><font color='green'>// 首先计算串2 的长度。串2 指针放入edi 中。</font></i>
<a name='L245'>           "repne\n\t"          <i><font color='green'>// 比较al(0)与串2 中的字符(es:[edi]),并edi++。</font></i>
<a name='L246'>           "scasb\n\t"          <i><font color='green'>// 如果不相等就继续比较(ecx 逐步递减)。</font></i>
<a name='L247'>           "notl %%ecx\n\t"     <i><font color='green'>// ecx 中每位取反。</font></i>
<a name='L248'>           "decl %%ecx\n\t"     <i><font color='green'>// ecx--,得串2 的长度值。</font></i>
<a name='L249'>           "movl %%ecx,%%edx\n" <i><font color='green'>// 将串2 的长度值暂放入edx 中。</font></i>
<a name='L250'>           "1:\tlodsb\n\t"      <i><font color='green'>// 取串1 字符ds:[esi]??al,并且esi++。</font></i>
<a name='L251'>           "testb %%al,%%al\n\t"        <i><font color='green'>// 该字符等于0 值吗(串1 结尾)?</font></i>
<a name='L252'>           "je 2f\n\t"          <i><font color='green'>// 如果是,则向前跳转到标号2 处。</font></i>
<a name='L253'>           "movl %4,%%edi\n\t"  <i><font color='green'>// 取串2 头指针放入edi 中。</font></i>
<a name='L254'>           "movl %%edx,%%ecx\n\t"       <i><font color='green'>// 再将串2 的长度值放入ecx 中。</font></i>
<a name='L255'>           "repne\n\t"          <i><font color='green'>// 比较al 与串2 中字符es:[edi],并且edi++。</font></i>
<a name='L256'>           "scasb\n\t"          <i><font color='green'>// 如果不相等就继续比较。</font></i>
<a name='L257'>           "jne 1b\n"           <i><font color='green'>// 如果不相等,则向后跳转到标号1 处。</font></i>
<a name='L258'>           "2:\tdecl %0"        <i><font color='green'>// esi--,指向最后一个包含在串2 中的字符。</font></i>
<a name='L259'>: "=S" (__res): "a" (0), "c" (0xffffffff), "" (cs), "g" (ct):"ax", "cx", "dx",
<a name='L260'>           "di");
<a name='L261'>  <b>return</b> __res - cs;            <i><font color='green'>// 返回字符序列的长度值。</font></i>
<a name='L262'><font color='red'>}</font>
<a name='L263'>
<a name='L264'><i><font color='green'>//// 在字符串1 中寻找首个包含在字符串2 中的任何字符。</font></i>
<a name='L265'><i><font color='green'>// 参数:cs - 字符串1 的指针,ct - 字符串2 的指针。</font></i>
<a name='L266'><i><font color='green'>// %0 -esi(__res),%1 -eax(0),%2 -ecx(0xffffffff),%3 -esi(串1 指针cs),%4 -(串2 指针ct)。</font></i>
<a name='L267'><i><font color='green'>// 返回字符串1 中首个包含字符串2 中字符的指针。</font></i>
<a name='L268'><b>extern</b> <b>inline</b> <b>char</b> *
<a name='L269'>strpbrk (<b>const</b> <b>char</b> *cs, <b>const</b> <b>char</b> *ct)
<a name='L270'><font color='red'>{</font>
<a name='L271'>  <b>register</b> <b>char</b> *__res <b>__asm__</b> ("si");  <i><font color='green'>// __res 是寄存器变量(esi)。</font></i>
<a name='L272'>  <b>__asm__</b> ("cld\n\t"            <i><font color='green'>// 清方向位。</font></i>
<a name='L273'>           "movl %4,%%edi\n\t"  <i><font color='green'>// 首先计算串2 的长度。串2 指针放入edi 中。</font></i>
<a name='L274'>           "repne\n\t"          <i><font color='green'>// 比较al(0)与串2 中的字符(es:[edi]),并edi++。</font></i>
<a name='L275'>           "scasb\n\t"          <i><font color='green'>// 如果不相等就继续比较(ecx 逐步递减)。</font></i>
<a name='L276'>           "notl %%ecx\n\t"     <i><font color='green'>// ecx 中每位取反。</font></i>
<a name='L277'>           "decl %%ecx\n\t"     <i><font color='green'>// ecx--,得串2 的长度值。</font></i>
<a name='L278'>           "movl %%ecx,%%edx\n" <i><font color='green'>// 将串2 的长度值暂放入edx 中。</font></i>
<a name='L279'>           "1:\tlodsb\n\t"      <i><font color='green'>// 取串1 字符ds:[esi]??al,并且esi++。</font></i>
<a name='L280'>           "testb %%al,%%al\n\t"        <i><font color='green'>// 该字符等于0 值吗(串1 结尾)?</font></i>
<a name='L281'>           "je 2f\n\t"          <i><font color='green'>// 如果是,则向前跳转到标号2 处。</font></i>
<a name='L282'>           "movl %4,%%edi\n\t"  <i><font color='green'>// 取串2 头指针放入edi 中。</font></i>
<a name='L283'>           "movl %%edx,%%ecx\n\t"       <i><font color='green'>// 再将串2 的长度值放入ecx 中。</font></i>
<a name='L284'>           "repne\n\t"          <i><font color='green'>// 比较al 与串2 中字符es:[edi],并且edi++。</font></i>
<a name='L285'>           "scasb\n\t"          <i><font color='green'>// 如果不相等就继续比较。</font></i>
<a name='L286'>           "jne 1b\n\t"         <i><font color='green'>// 如果不相等,则向后跳转到标号1 处。</font></i>
<a name='L287'>           "decl %0\n\t"        <i><font color='green'>// esi--,指向一个包含在串2 中的字符。</font></i>
<a name='L288'>           "jmp 3f\n"           <i><font color='green'>// 向前跳转到标号3 处。</font></i>
<a name='L289'>           "2:\txorl %0,%0\n"   <i><font color='green'>// 没有找到符合条件的,将返回值为NULL。</font></i>
<a name='L290'>"3:": "=S" (__res): "a" (0), "c" (0xffffffff), "" (cs), "g" (ct):"ax", "cx", "dx",
<a name='L291'>           "di");
<a name='L292'>  <b>return</b> __res;                 <i><font color='green'>// 返回指针值。</font></i>
<a name='L293'><font color='red'>}</font>
<a name='L294'>
<a name='L295'><i><font color='green'>//// 在字符串1 中寻找首个匹配整个字符串2 的字符串。</font></i>
<a name='L296'><i><font color='green'>// 参数:cs - 字符串1 的指针,ct - 字符串2 的指针。</font></i>
<a name='L297'><i><font color='green'>// %0 -eax(__res),%1 -eax(0),%2 -ecx(0xffffffff),%3 -esi(串1 指针cs),%4 -(串2 指针ct)。</font></i>
<a name='L298'><i><font color='green'>// 返回:返回字符串1 中首个匹配字符串2 的字符串指针。</font></i>
<a name='L299'><b>extern</b> <b>inline</b> <b>char</b> *
<a name='L300'>strstr (<b>const</b> <b>char</b> *cs, <b>const</b> <b>char</b> *ct)
<a name='L301'><font color='red'>{</font>
<a name='L302'>  <b>register</b> <b>char</b> *__res <b>__asm__</b> ("ax");  <i><font color='green'>// __res 是寄存器变量(eax)。</font></i>
<a name='L303'>  <b>__asm__</b> ("cld\n\t" \          <i><font color='green'>// 清方向位。</font></i>
<a name='L304'>           "movl %4,%%edi\n\t"  <i><font color='green'>// 首先计算串2 的长度。串2 指针放入edi 中。</font></i>
<a name='L305'>           "repne\n\t"          <i><font color='green'>// 比较al(0)与串2 中的字符(es:[edi]),并edi++。</font></i>
<a name='L306'>           "scasb\n\t"          <i><font color='green'>// 如果不相等就继续比较(ecx 逐步递减)。</font></i>
<a name='L307'>           "notl %%ecx\n\t"     <i><font color='green'>// ecx 中每位取反。</font></i>
<a name='L308'>           "decl %%ecx\n\t"     <i><font color='green'>/* NOTE! This also sets Z if searchstring='' */</font></i>
<a name='L309'><i><font color='green'>/* 注意!如果搜索串为空,将设置Z 标志 */</font></i><i><font color='green'>// 得串2 的长度值。</font></i>
<a name='L310'>           "movl %%ecx,%%edx\n" <i><font color='green'>// 将串2 的长度值暂放入edx 中。</font></i>
<a name='L311'>           "1:\tmovl %4,%%edi\n\t"      <i><font color='green'>// 取串2 头指针放入edi 中。</font></i>
<a name='L312'>           "movl %%esi,%%eax\n\t"       <i><font color='green'>// 将串1 的指针复制到eax 中。</font></i>
<a name='L313'>           "movl %%edx,%%ecx\n\t"       <i><font color='green'>// 再将串2 的长度值放入ecx 中。</font></i>
<a name='L314'>           "repe\n\t"           <i><font color='green'>// 比较串1 和串2 字符(ds:[esi],es:[edi]),esi++,edi++。</font></i>
<a name='L315'>           "cmpsb\n\t"          <i><font color='green'>// 若对应字符相等就一直比较下去。</font></i>
<a name='L316'>           "je 2f\n\t"          <i><font color='green'>/* also works for empty string, see above */</font></i>
<a name='L317'><i><font color='green'>/* 对空串同样有效,见上面 */</font></i><i><font color='green'>// 若全相等,则转到标号2。</font></i>
<a name='L318'>           "xchgl %%eax,%%esi\n\t"      <i><font color='green'>// 串1 头指针??esi,比较结果的串1 指针??eax。</font></i>
<a name='L319'>           "incl %%esi\n\t"     <i><font color='green'>// 串1 头指针指向下一个字符。</font></i>
<a name='L320'>           "cmpb $0,-1(%%eax)\n\t"      <i><font color='green'>// 串1 指针(eax-1)所指字节是0 吗?</font></i>
<a name='L321'>           "jne 1b\n\t"         <i><font color='green'>// 不是则跳转到标号1,继续从串1 的第2 个字符开始比较。</font></i>
<a name='L322'>           "xorl %%eax,%%eax\n\t"       <i><font color='green'>// 清eax,表示没有找到匹配。</font></i>
<a name='L323'>"2:": "=a" (__res): "" (0), "c" (0xffffffff), "S" (cs), "g" (ct):"cx", "dx", "di",
<a name='L324'>           "si");
<a name='L325'>  <b>return</b> __res;                 <i><font color='green'>// 返回比较结果。</font></i>
<a name='L326'><font color='red'>}</font>
<a name='L327'>
<a name='L328'><i><font color='green'>//// 计算字符串长度。</font></i>
<a name='L329'><i><font color='green'>// 参数:s - 字符串。</font></i>
<a name='L330'><i><font color='green'>// %0 - ecx(__res),%1 - edi(字符串指针s),%2 - eax(0),%3 - ecx(0xffffffff)。</font></i>
<a name='L331'><i><font color='green'>// 返回:返回字符串的长度。</font></i>
<a name='L332'><b>extern</b> <b>inline</b> <b>int</b>
<a name='L333'><a href='../S/78.html#L258' title='Refered from 258 in kernel/vsprintf.c.'>strlen</a> (<b>const</b> <b>char</b> *s)
<a name='L334'><font color='red'>{</font>
<a name='L335'>  <b>register</b> <b>int</b> __res <b>__asm__</b> ("cx");    <i><font color='green'>// __res 是寄存器变量(ecx)。</font></i>
<a name='L336'>  <b>__asm__</b> ("cld\n\t"            <i><font color='green'>// 清方向位。</font></i>
<a name='L337'>           "repne\n\t"          <i><font color='green'>// al(0)与字符串中字符es:[edi]比较,</font></i>
<a name='L338'>           "scasb\n\t"          <i><font color='green'>// 若不相等就一直比较。</font></i>
<a name='L339'>           "notl %0\n\t"        <i><font color='green'>// ecx 取反。</font></i>
<a name='L340'>           "decl %0"            <i><font color='green'>// ecx--,得字符串得长度值。</font></i>
<a name='L341'>: "=c" (__res): "D" (s), "a" (0), "" (0xffffffff):"di");
<a name='L342'>  <b>return</b> __res;                 <i><font color='green'>// 返回字符串长度值。</font></i>
<a name='L343'><font color='red'>}</font>
<a name='L344'>
<a name='L345'><b>extern</b> <b>char</b> *___strtok;         <i><font color='green'>// 用于临时存放指向下面被分析字符串1(s)的指针。</font></i>
<a name='L346'>
<a name='L347'><i><font color='green'>//// 利用字符串2 中的字符将字符串1 分割成标记(tokern)序列。</font></i>
<a name='L348'><i><font color='green'>// 将串1 看作是包含零个或多个单词(token)的序列,并由分割符字符串2 中的一个或多个字符分开。</font></i>
<a name='L349'><i><font color='green'>// 第一次调用strtok()时,将返回指向字符串1 中第1 个token 首字符的指针,并在返回token 时将</font></i>
<a name='L350'><i><font color='green'>// 一null 字符写到分割符处。后续使用null 作为字符串1 的调用,将用这种方法继续扫描字符串1,</font></i>
<a name='L351'><i><font color='green'>// 直到没有token 为止。在不同的调用过程中,分割符串2 可以不同。</font></i>
<a name='L352'><i><font color='green'>// 参数:s - 待处理的字符串1,ct - 包含各个分割符的字符串2。</font></i>
<a name='L353'><i><font color='green'>// 汇编输出:%0 - ebx(__res),%1 - esi(__strtok);</font></i>
<a name='L354'><i><font color='green'>// 汇编输入:%2 - ebx(__strtok),%3 - esi(字符串1 指针s),%4 - (字符串2 指针ct)。</font></i>
<a name='L355'><i><font color='green'>// 返回:返回字符串s 中第1 个token,如果没有找到token,则返回一个null 指针。</font></i>
<a name='L356'><i><font color='green'>// 后续使用字符串s 指针为null 的调用,将在原字符串s 中搜索下一个token。</font></i>
<a name='L357'><b>extern</b> <b>inline</b> <b>char</b> *
<a name='L358'>strtok (<b>char</b> *s, <b>const</b> <b>char</b> *ct)
<a name='L359'><font color='red'>{</font>
<a name='L360'>  <b>register</b> <b>char</b> *__res <b>__asm__</b> ("si");
<a name='L361'>  <b>__asm__</b> ("testl %1,%1\n\t"    <i><font color='green'>// 首先测试esi(字符串1 指针s)是否是NULL。</font></i>
<a name='L362'>           "jne 1f\n\t"         <i><font color='green'>// 如果不是,则表明是首次调用本函数,跳转标号1。</font></i>
<a name='L363'>           "testl %0,%0\n\t"    <i><font color='green'>// 如果是NULL,则表示此次是后续调用,测ebx(__strtok)。</font></i>
<a name='L364'>           "je 8f\n\t"          <i><font color='green'>// 如果ebx 指针是NULL,则不能处理,跳转结束。</font></i>
<a name='L365'>           "movl %0,%1\n"       <i><font color='green'>// 将ebx 指针复制到esi。</font></i>
<a name='L366'>           "1:\txorl %0,%0\n\t" <i><font color='green'>// 清ebx 指针。</font></i>
<a name='L367'>           "movl $-1,%%ecx\n\t" <i><font color='green'>// 置ecx = 0xffffffff。</font></i>
<a name='L368'>           "xorl %%eax,%%eax\n\t"       <i><font color='green'>// 清零eax。</font></i>
<a name='L369'>           "cld\n\t"            <i><font color='green'>// 清方向位。</font></i>
<a name='L370'>           "movl %4,%%edi\n\t"  <i><font color='green'>// 下面求字符串2 的长度。edi 指向字符串2。</font></i>
<a name='L371'>           "repne\n\t"          <i><font color='green'>// 将al(0)与es:[edi]比较,并且edi++。</font></i>
<a name='L372'>           "scasb\n\t"          <i><font color='green'>// 直到找到字符串2 的结束null 字符,或计数ecx==0。</font></i>
<a name='L373'>           "notl %%ecx\n\t"     <i><font color='green'>// 将ecx 取反,</font></i>
<a name='L374'>           "decl %%ecx\n\t"     <i><font color='green'>// ecx--,得到字符串2 的长度值。</font></i>

⌨️ 快捷键说明

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