📄 42.html
字号:
<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<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 < 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>块2 返回1;块1<块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 内容的值<内存块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'>/* [<][>]<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 + -