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

📄 42.html

📁 linux 0.11中文版 有注释
💻 HTML
📖 第 1 页 / 共 4 页
字号:
<a name='L375'>           "je 7f\n\t"          <i><font color='green'>/* empty delimeter-string */</font></i>
<a name='L376'><i><font color='green'>/* 分割符字符串空 */</font></i><i><font color='green'>// 若串2 长度为0,则转标号7。</font></i>
<a name='L377'>           "movl %%ecx,%%edx\n" <i><font color='green'>// 将串2 长度暂存入edx。</font></i>
<a name='L378'>           "2:\tlodsb\n\t"      <i><font color='green'>// 取串1 的字符ds:[esi]??al,并且esi++。</font></i>
<a name='L379'>           "testb %%al,%%al\n\t"        <i><font color='green'>// 该字符为0 值吗(串1 结束)?</font></i>
<a name='L380'>           "je 7f\n\t"          <i><font color='green'>// 如果是,则跳转标号7。</font></i>
<a name='L381'>           "movl %4,%%edi\n\t"  <i><font color='green'>// edi 再次指向串2 首。</font></i>
<a name='L382'>           "movl %%edx,%%ecx\n\t"       <i><font color='green'>// 取串2 的长度值置入计数器ecx。</font></i>
<a name='L383'>           "repne\n\t"          <i><font color='green'>// 将al 中串1 的字符与串2 中所有字符比较,</font></i>
<a name='L384'>           "scasb\n\t"          <i><font color='green'>// 判断该字符是否为分割符。</font></i>
<a name='L385'>           "je 2b\n\t"          <i><font color='green'>// 若能在串2 中找到相同字符(分割符),则跳转标号2。</font></i>
<a name='L386'>           "decl %1\n\t"        <i><font color='green'>// 若不是分割符,则串1 指针esi 指向此时的该字符。</font></i>
<a name='L387'>           "cmpb $0,(%1)\n\t"   <i><font color='green'>// 该字符是NULL 字符吗?</font></i>
<a name='L388'>           "je 7f\n\t"          <i><font color='green'>// 若是,则跳转标号7 处。</font></i>
<a name='L389'>           "movl %1,%0\n"       <i><font color='green'>// 将该字符的指针esi 存放在ebx。</font></i>
<a name='L390'>           "3:\tlodsb\n\t"      <i><font color='green'>// 取串1 下一个字符ds:[esi]??al,并且esi++。</font></i>
<a name='L391'>           "testb %%al,%%al\n\t"        <i><font color='green'>// 该字符是NULL 字符吗?</font></i>
<a name='L392'>           "je 5f\n\t"          <i><font color='green'>// 若是,表示串1 结束,跳转到标号5。</font></i>
<a name='L393'>           "movl %4,%%edi\n\t"  <i><font color='green'>// edi 再次指向串2 首。</font></i>
<a name='L394'>           "movl %%edx,%%ecx\n\t"       <i><font color='green'>// 串2 长度值置入计数器ecx。</font></i>
<a name='L395'>           "repne\n\t"          <i><font color='green'>// 将al 中串1 的字符与串2 中每个字符比较,</font></i>
<a name='L396'>           "scasb\n\t"          <i><font color='green'>// 测试al 字符是否是分割符。</font></i>
<a name='L397'>           "jne 3b\n\t"         <i><font color='green'>// 若不是分割符则跳转标号3,检测串1 中下一个字符。</font></i>
<a name='L398'>           "decl %1\n\t"        <i><font color='green'>// 若是分割符,则esi--,指向该分割符字符。</font></i>
<a name='L399'>           "cmpb $0,(%1)\n\t"   <i><font color='green'>// 该分割符是NULL 字符吗?</font></i>
<a name='L400'>           "je 5f\n\t"          <i><font color='green'>// 若是,则跳转到标号5。</font></i>
<a name='L401'>           "movb $0,(%1)\n\t"   <i><font color='green'>// 若不是,则将该分割符用NULL 字符替换掉。</font></i>
<a name='L402'>           "incl %1\n\t"        <i><font color='green'>// esi 指向串1 中下一个字符,也即剩余串首。</font></i>
<a name='L403'>           "jmp 6f\n"           <i><font color='green'>// 跳转标号6 处。</font></i>
<a name='L404'>           "5:\txorl %1,%1\n"   <i><font color='green'>// esi 清零。</font></i>
<a name='L405'>           "6:\tcmpb $0,(%0)\n\t"       <i><font color='green'>// ebx 指针指向NULL 字符吗?</font></i>
<a name='L406'>           "jne 7f\n\t"         <i><font color='green'>// 若不是,则跳转标号7。</font></i>
<a name='L407'>           "xorl %0,%0\n"       <i><font color='green'>// 若是,则让ebx=NULL。</font></i>
<a name='L408'>           "7:\ttestl %0,%0\n\t"        <i><font color='green'>// ebx 指针为NULL 吗?</font></i>
<a name='L409'>           "jne 8f\n\t"         <i><font color='green'>// 若不是则跳转8,结束汇编代码。</font></i>
<a name='L410'>           "movl %0,%1\n"       <i><font color='green'>// 将esi 置为NULL。</font></i>
<a name='L411'>"8:": "=b" (__res), "=S" (___strtok): "" (___strtok), "1" (s), "g" (ct):"ax", "cx", "dx",
<a name='L412'>           "di");
<a name='L413'>  <b>return</b> __res;                 <i><font color='green'>// 返回指向新token 的指针。</font></i>
<a name='L414'><font color='red'>}</font>
<a name='L415'>
<a name='L416'><i><font color='green'>//// 内存块复制。从源地址src 处开始复制n 个字节到目的地址dest 处。</font></i>
<a name='L417'><i><font color='green'>// 参数:dest - 复制的目的地址,src - 复制的源地址,n - 复制字节数。</font></i>
<a name='L418'><i><font color='green'>// %0 - ecx(n),%1 - esi(src),%2 - edi(dest)。</font></i>
<a name='L419'><b>extern</b> <b>inline</b> <b>void</b> *
<a name='L420'><a href='../R/529.html' title='Multiple refered from 3 places.'>memcpy</a> (<b>void</b> *dest, <b>const</b> <b>void</b> *src, <b>int</b> n)
<a name='L421'><font color='red'>{</font>
<a name='L422'>  <b>__asm__</b> ("cld\n\t"            <i><font color='green'>// 清方向位。</font></i>
<a name='L423'>           "rep\n\t"            <i><font color='green'>// 重复执行复制ecx 个字节,</font></i>
<a name='L424'>           "movsb"              <i><font color='green'>// 从ds:[esi]到es:[edi],esi++,edi++。</font></i>
<a name='L425'>::"c" (n), "S" (src), "D" (dest):"cx", "si", "di");
<a name='L426'>  <b>return</b> dest;                  <i><font color='green'>// 返回目的地址。</font></i>
<a name='L427'><font color='red'>}</font>
<a name='L428'>
<a name='L429'><i><font color='green'>//// 内存块移动。同内存块复制,但考虑移动的方向。</font></i>
<a name='L430'><i><font color='green'>// 参数:dest - 复制的目的地址,src - 复制的源地址,n - 复制字节数。</font></i>
<a name='L431'><i><font color='green'>// 若dest&lt;src 则:%0 - ecx(n),%1 - esi(src),%2 - edi(dest)。</font></i>
<a name='L432'><i><font color='green'>// 否则:%0 - ecx(n),%1 - esi(src+n-1),%2 - edi(dest+n-1)。</font></i>
<a name='L433'><i><font color='green'>// 这样操作是为了防止在复制时错误地重叠覆盖。</font></i>
<a name='L434'><b>extern</b> <b>inline</b> <b>void</b> *
<a name='L435'>memmove (<b>void</b> *dest, <b>const</b> <b>void</b> *src, <b>int</b> n)
<a name='L436'><font color='red'>{</font>
<a name='L437'>  <b>if</b> (dest &lt; src)
<a name='L438'>    <b>__asm__</b> ("cld\n\t"          <i><font color='green'>// 清方向位。</font></i>
<a name='L439'>             "rep\n\t"          <i><font color='green'>// 从ds:[esi]到es:[edi],并且esi++,edi++,</font></i>
<a name='L440'>             "movsb"            <i><font color='green'>// 重复执行复制ecx 字节。</font></i>
<a name='L441'>  ::"c" (n), "S" (src), "D" (dest):"cx", "si", "di");
<a name='L442'>  <b>else</b>
<a name='L443'>    <b>__asm__</b> ("std\n\t"          <i><font color='green'>// 置方向位,从末端开始复制。</font></i>
<a name='L444'>             "rep\n\t"          <i><font color='green'>// 从ds:[esi]到es:[edi],并且esi--,edi--,</font></i>
<a name='L445'>             "movsb"            <i><font color='green'>// 复制ecx 个字节。</font></i>
<a name='L446'>  ::"c" (n), "S" (src + n - 1), "D" (dest + n - 1):"cx", "si",
<a name='L447'>             "di");
<a name='L448'>  <b>return</b> dest;
<a name='L449'><font color='red'>}</font>
<a name='L450'>
<a name='L451'><i><font color='green'>//// 比较n 个字节的两块内存(两个字符串),即使遇上NULL 字节也不停止比较。</font></i>
<a name='L452'><i><font color='green'>// 参数:cs - 内存块1 地址,ct - 内存块2 地址,count - 比较的字节数。</font></i>
<a name='L453'><i><font color='green'>// %0 - eax(__res),%1 - eax(0),%2 - edi(内存块1),%3 - esi(内存块2),%4 - ecx(count)。</font></i>
<a name='L454'><i><font color='green'>// 返回:若块1&gt;块2 返回1;块1&lt;块2,返回-1;块1==块2,则返回0。</font></i>
<a name='L455'><b>extern</b> <b>inline</b> <b>int</b>
<a name='L456'>memcmp (<b>const</b> <b>void</b> *cs, <b>const</b> <b>void</b> *ct, <b>int</b> count)
<a name='L457'><font color='red'>{</font>
<a name='L458'>  <b>register</b> <b>int</b> __res <b>__asm__</b> ("ax");    <i><font color='green'>// __res 是寄存器变量。</font></i>
<a name='L459'>  <b>__asm__</b> ("cld\n\t"            <i><font color='green'>// 清方向位。</font></i>
<a name='L460'>           "repe\n\t"           <i><font color='green'>// 如果相等则重复,</font></i>
<a name='L461'>           "cmpsb\n\t"          <i><font color='green'>// 比较ds:[esi]与es:[edi]的内容,并且esi++,edi++。</font></i>
<a name='L462'>           "je 1f\n\t"          <i><font color='green'>// 如果都相同,则跳转到标号1,返回0(eax)值</font></i>
<a name='L463'>           "movl $1,%%eax\n\t"  <i><font color='green'>// 否则eax 置1,</font></i>
<a name='L464'>           "jl 1f\n\t"          <i><font color='green'>// 若内存块2 内容的值&lt;内存块1,则跳转标号1。</font></i>
<a name='L465'>           "negl %%eax\n"       <i><font color='green'>// 否则eax = -eax。</font></i>
<a name='L466'>"1:": "=a" (__res): "" (0), "D" (cs), "S" (ct), "c" (<a href='../D/738.html' title='Multiple defined in 17 places.'>count</a>):"si", "di",
<a name='L467'>           "cx");
<a name='L468'>  <b>return</b> __res;                 <i><font color='green'>// 返回比较结果。</font></i>
<a name='L469'><font color='red'>}</font>
<a name='L470'>
<a name='L471'><i><font color='green'>//// 在n 字节大小的内存块(字符串)中寻找指定字符。</font></i>
<a name='L472'><i><font color='green'>// 参数:cs - 指定内存块地址,c - 指定的字符,count - 内存块长度。</font></i>
<a name='L473'><i><font color='green'>// %0 - edi(__res),%1 - eax(字符c),%2 - edi(内存块地址cs),%3 - ecx(字节数count)。</font></i>
<a name='L474'><i><font color='green'>// 返回第一个匹配字符的指针,如果没有找到,则返回NULL 字符。</font></i>
<a name='L475'><b>extern</b> <b>inline</b> <b>void</b> *
<a name='L476'>memchr (<b>const</b> <b>void</b> *cs, <b>char</b> c, <b>int</b> count)
<a name='L477'><font color='red'>{</font>
<a name='L478'>  <b>register</b> <b>void</b> *__res <b>__asm__</b> ("di");  <i><font color='green'>// __res 是寄存器变量。</font></i>
<a name='L479'>  <b>if</b> (!<a href='../D/738.html' title='Multiple defined in 17 places.'>count</a>)                   <i><font color='green'>// 如果内存块长度==0,则返回NULL,没有找到。</font></i>
<a name='L480'>    <b>return</b> <a href='../D/261.html' title='Multiple defined in 12 places.'>NULL</a>;
<a name='L481'>  <b>__asm__</b> ("cld\n\t"            <i><font color='green'>// 清方向位。</font></i>
<a name='L482'>           "repne\n\t"          <i><font color='green'>// 如果不相等则重复执行下面语句,</font></i>
<a name='L483'>           "scasb\n\t"          <i><font color='green'>// al 中字符与es:[edi]字符作比较,并且edi++,</font></i>
<a name='L484'>           "je 1f\n\t"          <i><font color='green'>// 如果相等则向前跳转到标号1 处。</font></i>
<a name='L485'>           "movl $1,%0\n"       <i><font color='green'>// 否则edi 中置1。</font></i>
<a name='L486'>           "1:\tdecl %0"        <i><font color='green'>// 让edi 指向找到的字符(或是NULL)。</font></i>
<a name='L487'>: "=D" (__res): "a" (c), "D" (cs), "c" (<a href='../D/738.html' title='Multiple defined in 17 places.'>count</a>):"cx");
<a name='L488'>  <b>return</b> __res;                 <i><font color='green'>// 返回字符指针。</font></i>
<a name='L489'><font color='red'>}</font>
<a name='L490'>
<a name='L491'><i><font color='green'>//// 用字符填写指定长度内存块。</font></i>
<a name='L492'><i><font color='green'>// 用字符c 填写s 指向的内存区域,共填count 字节。</font></i>
<a name='L493'><i><font color='green'>// %0 - eax(字符c),%1 - edi(内存地址),%2 - ecx(字节数count)。</font></i>
<a name='L494'><b>extern</b> <b>inline</b> <b>void</b> *
<a name='L495'><a href='../R/530.html' title='Multiple refered from 3 places.'>memset</a> (<b>void</b> *s, <b>char</b> c, <b>int</b> count)
<a name='L496'><font color='red'>{</font>
<a name='L497'>  <b>__asm__</b> ("cld\n\t"            <i><font color='green'>// 清方向位。</font></i>
<a name='L498'>           "rep\n\t"            <i><font color='green'>// 重复ecx 指定的次数,执行</font></i>
<a name='L499'>           "stosb"              <i><font color='green'>// 将al 中字符存入es:[edi]中,并且edi++。</font></i>
<a name='L500'>::"a" (c), "D" (s), "c" (<a href='../D/738.html' title='Multiple defined in 17 places.'>count</a>):"cx", "di");
<a name='L501'>  <b>return</b> s;
<a name='L502'><font color='red'>}</font>
<a name='L503'>
<a name='L504'><font color='darkred'>#endif</font>
</pre>
<hr>
<a name='BOTTOM'>
<i><font color='green'>/* [&lt;][&gt;]<a href='#L40'>[^]</a><a href='#L495'>[v]</a><a href='#TOP'>[top]</a>[bottom]<a href='../mains.html'>[index]</a><a href='../help.html'>[help]</a> */</font></i>
</body>
</html>

⌨️ 快捷键说明

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