Á¦ ¸ñ:[°­ÁÂ] ÀζóÀÎ ¾î¼Àºí¸®¸¦ ºÐ¼®ÇÏÀÚ. (3) °ü·ÃÀÚ·á:¾øÀ½ [571] º¸³½ÀÌ:Çѵ¿ÈÆ (ddoch ) 1997-02-19 15:29 Á¶È¸:622 2.9 strspn strspnÀº Àß »ç¿ëÇØ º¸Áö ¾Ê¾ÒÀ» °ÍÀÌ´Ù. ¿øÇüÀº ´ÙÀ½°ú °°´Ù. size_t strspn(const char *cs, const char *ct); À̰ÍÀº ct¿¡ ¾ø´Â ±ÛÀÚµé °¡¿îµ¥ ¸Ç óÀ½À¸·Î cs¿¡ ³ªÅ¸³­ ±ÛÀÚÀÇ À§ Ä¡¸¦ µ¹·ÁÁØ´Ù. ÀÌ´Â csÀÇ ¸Ç óÀ½ºÎÅÍ ½ÃÀÛÇÏ¿© ct¿¡ ÀÖ´Â ±ÛÀÚ·Î ¸¸ ÀÌ·ç¾îÁø ½ºÆ®¸µÀÇ ÃÖ´ë ±æÀÌ¿Í °°´Ù. ctÀÇ ¸Ç óÀ½ ±ÛÀÚ°¡ cs¿¡ ¾ø´Â ±ÛÀÚÀÎ °æ¿ì¿¡´Â 0À̵ȴÙ. strspn("abcdefghijklmn", "abcdefg"); À̰ÍÀº ¾ÕÂÊ ¹®ÀÚ¿­ Áß 'g'±îÁöÀÇ °¹¼öÀÎ 7À» ¹ÝȯÇÑ´Ù. ÀÌÁ¦ ¾î¼Àºí¸® ·çƾÀ» »ìÆìº¸ÀÚ. extern inline size_t strspn(const char * cs, const char * ct) { register char * __res; __asm__ __volatile__( "cld\n\t" "movl %4,%%edi\n\t" "repne\n\t" "scasb\n\t" "notl %%ecx\n\t" "decl %%ecx\n\t" "movl %%ecx,%%edx\n" "1:\tlodsb\n\t" "testb %%al,%%al\n\t" "je 2f\n\t" "movl %4,%%edi\n\t" "movl %%edx,%%ecx\n\t" "repne\n\t" "scasb\n\t" "je 1b\n" "2:\tdecl %0" :"=S" (__res):"a" (0),"c" (0xffffffff),"0" (cs),"g" (ct) :"ax","cx","dx","di"); return __res-cs; } * Á¶±Ý º¹ÀâÇØ º¸ÀÌÁö¸¸ Çϳª¾¿ »ìÆìº¸ÀÚ. * output Àº "=S" (__res) ±¸¹®¿¡ ÀÇÇØ esi ÀÇ °è»ê °á°ú°ªÀÌ C º¯¼öÀÎ __res¿¡ µÇµ¹·Á ÁüÀ» ¾Ë ¼ö ÀÖ´Ù. * input Çʵ带 »ìÆìº¸ÀÚ. * eax¿¡´Â 0À» ÀúÀåÇϰí, ecx¿¡¼­´Â ¹Ýº¹ÇÒ È½¼ö·Î¼­ ÃÖ´ëÀÇ °ªÀ» ÀúÀå Çϰí ÀÖÀ¸¸ç, "0" (cs)´Â esi¿¡ csÀÇ °ªÀ» ÀúÀåÇÔÀ» À̾߱â Çϰí, "g" (ct) ´Â ctÀÇ °ªÀ» ¾îµð¿¡ ÀúÀåÇÒ °ÍÀÎÁö¸¦ ÄÄÆÄÀÏ·¯¿¡°Ô ¸Ã±ä´Ù. * registers Çʵ忡¼­´Â ¹Ýȯ°ªÀÌ ÀúÀåµÉ esi¸¦ Á¦¿ÜÇÑ ·¹Áö½ºÅͰ¡ ¼ö·Ï µÇ¾î ÀÖ´Ù. * commands Çʵ带 º¸ÀÚ. * movl %4, %%edi (movl ct, %%edi) ´Â csÀÇ ¹®ÀÚµéÀ» °Ë»çÇÒ ctÀÇ °ªÀ» edi¿¡ ¼ö·ÏÇϰí ÀÖ´Ù. * repne, scasb ´Â al(°ªÀº 0)ÀÇ °ª°ú edi°¡ °¡¸£Å°´Â °÷ÀÇ °ªÀ» ºñ±³ÇÏ¿© °°Áö ¾Ê´Ù¸é ¹Ýº¹ÇϹǷΠ°á±¹ ct¿¡¼­ ³Î¹®ÀÚ°¡ ÀÖ´Â °÷ÀÇ ´ÙÀ½À» edi°¡ °¡¸£Å°°Ô µÈ´Ù. * not notÀº op1ÀÇ 1ÀÇ º¸¼ö°ªÀ» ÃëÇÏ¿© op1¿¡ µÇµ¹¸°´Ù. Áï op1ÀÇ °¢ ºñÆ®¸¦ ¹ÝÀü½ÃŲ ÈÄ, ±× °á°ú¸¦ op1¿¡ µÇµ¹¸°´Ù. Ç÷¢¿¡´Â ¾Æ¹«·± ¿µÇâµµ ¹ÌÄ¡ Áö ¾Ê´Â´Ù. À§¿¡¼­ÀÇ notl %%ecx´Â ecxÀÇ °ªÀ» ºñÆ®¹ÝÀü ½ÃŲ´Ù. ¿Ö? óÀ½¿¡ ecxÀÇ °ªÀ» 0xffffffff·Î ó±âÈ­ ÇÏ¿´À½À» »ý°¢ÇÏÀÚ. ±×¸®°í repne´Â Çѹø ½Ç Çà ÈÄ ecxÀÇ °ªÀ» 1°¨¼Ò½ÃÅ´À» ±â¾ïÇÑ´Ù¸é, ÀÌÁ¦ ¹®ÀÚ¿­ ct¸¦ ´ÙÀ½°ú °°ÀÌ °¡Á¤Çغ¸ÀÚ. ct : "abcdefg\0\0" ¹®ÀÚ¿­ ±æÀÌ = 7 0123456 7 8 repne, scasb·Î ct(edi)°¡ °¡¸£Å°´Â °÷¿¡¼­ 0À» ãÀ» ¶§±îÁö ¹Ýº¹ÇÑ´Ù ¸é 7¹øÀ§Ä¡¿¡¼­ 0À» ã°í edi¸¦ Çϳª Áõ°¡½ÃÄÑ 8¹øÀ§Ä¡¸¦ °¡¸£Å°°Ô ÇÏ °í repne¸¦ Á¾·áÇÑ´Ù. °¢°¢ÀÇ À§Ä¡¸¦ edi°¡ °¡¸£Å³ ¶§ÀÇ ecxÀÇ °ªÀº ¾î ¶³°Ô º¯ÇÒ±î? 0: 0xffffffff 1: 0xfffffffe 2: 0xfffffffd 3: 0xfffffffc 4: 0xfffffffb 5: 0xfffffffa 6: 0xfffffff9 7: 0xfffffff8 8: 0xfffffff7 ecx : 0xfffffff7 -> 1111 1111 1111 1111 1111 1111 1111 0111 notl %%ecx -> 0000 0000 0000 0000 0000 0000 0000 1000 notl %%ecxÀÇ °è»ê°á°ú´Â 8ÀÌ µÈ´Ù. Áï, ctÀÇ ¹®ÀÚ¿­ ±æÀ̺¸´Ù Çϳª°¡ ±æ´Ù. * decl %%ecx ´Â %%ecx¸¦ Çϳª °¨¼Ò½ÃÄѼ­ ctÀÇ ¹®ÀÚ¿­ ±æÀ̸¸Å­À» ecx¿¡ ÃëÇÑ´Ù. À̰ÍÀº csÀÇ ÇϳªÀÇ ¹®ÀÚ¸¦ ct ¹®ÀÚ¿­°úÀÇ ºñ±³È½¼ö·Î½á »ç¿ë µÈ´Ù. * movl %%ecx, %%edx ´Â ecxÀÇ °ªÀ» edx¿¡ ¹é¾÷ÇÑ´Ù. * ÀÌÁ¦ ÁغñÀÛ¾÷À» ³¡³»°í ¿©±â¼­ ºÎÅÍ º»°Ý ·çÇÁ·Î µé¾î°£´Ù. * 1: lodsb ´Â ºñ±³¸¦ Çϱâ À§Çؼ­ esi·Î ºÎÅÍ ÇѹÙÀÌÆ®¸¦ Àоî¿Í¼­ al¿¡ À§Ä¡ ½ÃŲ´Ù. testb ·Î alÀÇ °ªÀÌ 0ÀÎÁö °Ë»çÇØ¼­ (testb %%al, %%al) 0ÀÌ¸é ¹®ÀÚ¿­ÀÇ ¸¶Áö¸·À̹ǷΠ2f·Î ºÐ±âÇÑ´Ù(je 2f). À̶§ ºÐ ±â ÇÒ ¶§ ÂëÀ̸é esi(cs)´Â ³Î¹®ÀÚ ´ÙÀ½ÀÇ À§Ä¡¸¦ °¡¸£Å°°Ô µÈ´Ù.±× ·¡¼­ 2f¿¡¼­´Â esi¸¦ Çϳª °¨¼Ò½ÃÄÑ cs³»ÀÇ ³Î¹®ÀÚ¸¦ °¡¸£Å°°Ô ÇÑ´Ù. * ºÐ±âÇÏÁö ¾Ê´Â °æ¿ì¸¦ °è¼Ó º¸ÀÚ. * movl %4, %%edi´Â edi¿¡ ctÀÇ °ªÀ» ³Ö´Â´Ù. * movl %%edx, %%ecx ´Â edx¿¡ ÀúÀåµÇÀÖ´Â ctÀÇ ¹®ÀÚ¿­ Å©±â¸¦ ecx ¿¡ ÀúÀåÇÑ´Ù. * repne, scasb ´Â ecxÀÇ È½¼ö¸¸Å­ ÇöÀç al¿¡ ¿Ã¶ó¿Í ÀÖ´Â csÀÇ ¹®ÀÚÇÏ ³ª¿Í edi(ct)°¡ °¡¸£Å°´Â °÷ÀÇ ¹®ÀÚ¸¦ Â÷·Ê´ë·Î ºñ±³¸¦ ÇØ¼­ °°Áö ¾Ê ´Ù¸é ¹Ýº¹ÇÑ´Ù. ±×·¡¼­ alÀÇ °°Àº ¹®ÀÚ°¡ edi³»¿¡¼­ ³ª¿ÀÁö ¾Ê´Â´Ù¸é zf´Â 0ÀÌ µÉ °ÍÀ̰í, °°Àº ¹®ÀÚ°¡ ³ª¿Â´Ù¸é zf´Â 1·Î ¼¼Æ®µÉ °ÍÀÌ´Ù. * je 1b´Â csÀÇ ¹®ÀÚÇϳª°¡ ctÀÇ ¹®ÀÚ¿­³»¿¡ ÀÖ´Â Áö º¸¾Æ¼­ ÀÖ´Ù¸é °è ¼Ó 1b·çÇÁ·Î °¡¼­ ¾È³ª¿Ã ¶§±îÁö³ª ³Î¹®ÀÚ°¡ ³ª¿Ã ¶§±îÁö ¹Ýº¹ÇÑ´Ù. ¸¸ÀÏ °°Áö ¾Ê´Ù¸é ¸ñÀûÀ» ´Þ¼ºÇßÀ¸¹Ç·Î Çϳª°¡ ´õ Ä¿Áø esi¸¦ Çϳª °¨¼Ò½Ã۰í Á¾·áÇÑ´Ù. * ¿ª½Ã³ª ¶óº§ 1b¿¡¼­´Â al·Î ¹®ÀÚ¸¦ Çϳª ÀоîµéÀÌ°í ³Î¹®ÀÚ°¡ ¾Æ´Ï ¶ó¸é edi·Î ctÀÇ °ªÀ» ÀоîµéÀ̰í ecxÀÇ °ª¸¸Å­ al°ú ct¸¦ ºñ±³ÇÑ´Ù. °°´Ù¸é ·çÇÁ 1b·Î °¡°í ¾Æ´Ï¶ó¸é Á¾·áÇÑ´Ù. Áï, esiÀÇ °ªÀº ctÀÇ ¹® ÀÚ¿­¼Ó¿¡ ¾ø´Â ¹®ÀÚÀÇ ´ÙÀ½À» °¡¸£Å°°í ÀÖÀ½À» ÁÖ¸ñÇÏÀÚ. * __res¿¡´Â ¸¶Áö¸· esiÀÇ °ªÀÌ ´ã°Ü ÀÖ°í cs´Â ¿ø ºñ±³´ë»ó ¹®ÀÚ¿­ÀÌ ÀÖÀ¸¹Ç·Î __res - cs´Â cs³»ÀÇ ct¿Í °°Áö ¾ÊÀº ¹®ÀÚ°¡ óÀ½À¸·Î ³ª Ÿ³ª´Â °÷ÀÇ À妽º¸¦ µ¹·ÁÁØ´Ù. 2.10 strcspn strcspnÀº strspn°ú ¹Ý´ëÀÇ ¿ªÇÒÀ» ÇÑ´Ù. strcspnÀÇ ¿øÇüÀº ´ÙÀ½°ú °°´Ù. size_t strcspn(const char *cs, const char *ct); ÀÌ´Â csÀÇ ¸Ç óÀ½ºÎÅÍ ½ÃÀÛÇÏ¿© str2¿¡ ¾ø´Â ±ÛÀÚµéÀÇ ¿¬¼ÓÀûÀÎ Àüü ¼ö ¿Í °°´Ù. extern inline size_t strcspn(const char * cs, const char * ct) { register char * __res; __asm__ __volatile__( "cld\n\t" "movl %4,%%edi\n\t" /* ctÀÇ °ªÀ» edi¿¡ ¿Å±ä´Ù. */ "repne\n\t" /* al(0)ÀÇ °ª°ú ediÀÇ °ªÀ» ¹Ýº¹ºñ±³ÇÏ¿© °°ÀºÁö */ "scasb\n\t" /* °Ë»öÇÑ´Ù. 0¹®ÀÚ¸¦ ¸¸³ª¸é ±×´ÙÀ½À» °¡¸£Å²´Ù. */ "notl %%ecx\n\t" /* not ¿¬»êÀ¸·Î ctÀÇ ¹®ÀÚ¿­ °¹¼ö+1À» ecx¿¡ ±¸ÇÑ´Ù.*/ "decl %%ecx\n\t" /* ct ÀÇ ¹®ÀÚ¿­ °¹¼ö¸¦ ±¸ÇÑ´Ù. */ "movl %%ecx,%%edx\n" /* ctÀÇ ¹®ÀÚ¿­ °¹¼ö¸¦ edx¿¡ ¹é¾÷ÇÑ´Ù. */ "1:\tlodsb\n\t" /* esi¿¡¼­ Çѹ®ÀÚ¸¦ al·Î °¡Á®¿Â´Ù. */ "testb %%al,%%al\n\t" /* alÀÌ 0Àΰ¡¸¦ °Ë»çÇÑ´Ù. */ "je 2f\n\t" /* ¸¸ÀÏ 0À̶ó¸é 2f·Î ºÐ±âÇÑ´Ù. */ "movl %4,%%edi\n\t" /* ctÀÇ °ªÀ» edi¿¡ ´Ù½Ã ¿Å±ä´Ù. */ "movl %%edx,%%ecx\n\t" /* ctÀÇ ¹®ÀÚ¿­ °¹¼ö¸¦ ecx¿¡ ´Ù½Ã ¿Å±ä´Ù. */ "repne\n\t" /* al ÀÇ ¹®ÀÚ°¡ ct³»¿¡ ³ªÅ¸³ª´Â Áö¸¦ ctÀÇ ¹®ÀÚ¿­ */ "scasb\n\t" /* °¹¼ö¸¸Å­ ã±â¸¦ ¹Ýº¹ÇÑ´Ù. */ "jne 1b\n" /* alÀÌ ct³»¿¡ ¾ø´Â ¹®ÀÚ¶ó¸é 1b·Î ºÐ±âÇÏ¿© ¹Ýº¹ */ "2:\tdecl %0" /* esi°¡ Çϳª ´õ Áõ°¡µÇ¾î ÀÖÀ¸¹Ç·Î Çϳª °¨¼Ò½ÃŲ´Ù.*/ :"=S" (__res):"a" (0),"c" (0xffffffff),"0" (cs),"g" (ct) :"ax","cx","dx","di"); return __res-cs; /* __res-cs´Â cs³»¿¡¼­ ct¿¡ ¾ø´Â ±ÛÀÚµéÀÇ Àüü¼ö¸¦*/ /* µ¹·ÁÁÖ°Ô µÈ´Ù. */ } * output ºÎºÐÀº ¿©ÀüÈ÷ esi·Î¼­ __res¿¡ Àü´ÞµÈ´Ù. * inputºÎºÐÀº ¿©ÀüÈ÷ eax ¿¡´Â 0ÀÌ, ecx¿¡´Â 0xffffffff°¡, esi¿¡´Â cs °¡ Àü´ÞµÇ°í ct´Â ÄÄÆÄÀÏ·¯¿¡°Ô ¾îµð·Î °ªÀÌ Àü´ÞµÉ °ÍÀÎÁö¸¦ ¸Ã±ä´Ù. * registers Ç׸ñµµ ÀÌÀü°ú º° ´Ù¸¦¹Ù ¾ø´Ù. * commandsÇʵ带 Çϳª¾¿ »ìÆìº¸ÀÚ. ¹Ý´ë·Î ÀÛµ¿ÇÏ´Â ¸í·ÉÀÌ ¸î°³ »ç¿ëµÈ °ÍÀ» Á¦¿ÜÇϰí´Â strspn°ú º°´Ù¸§ÀÌ ¾øÀ½À» ¾Ë ¼ö ÀÖ´Ù. * strspn°ú ´Þ¶óÁø ºÎºÐÀº strspnÀÇ je 1b°¡ ¿©±â¼­´Â jne 1b·Î ¹Ù²ï °Í ¹Û¿¡ ¾ø´Ù. Áï, ÀÌÀü¿¡´Â alÀÌ ct³»¿¡ ÀÖÀ¸¸é ¹Ýº¹ÇÏ´ø °ÍÀ» ÀÌÁ¦´Â °°Áö ¾ÊÀ¸¸é ¹Ýº¹ÇÏ°í °°À¸¸é Á¾·áÇÑ´Ù. ÁÖ¼®À» Âü°íÇϸ鼭 ÇÑÁÙ¾¿ µû ¶ó°¡¸é ÀÌÇØ°¡ µÉ °ÍÀÌ´Ù. 2.11 strpbrk strpbrk´Â ¶Ç ¹«¾ùÀΰ¡? ¿øÇüÀº ´ÙÀ½°ú °°´Ù. char *strpbrk(const char *cs, const char *ct); strpbrk´Â strcspn°ú °°À¸³ª óÀ½À¸·Î ³ªÅ¸³­ ¹®ÀÚÀÇ À§Ä¡¸¦ Æ÷ÀÎÅÍ·Î ³Ñ °Ü ÁÖ´Â °ÍÀÌ ´Ù¸£´Ù. ¾î¼Àºí¸® ·çƾÀ» »ìÆìº¸ÀÚ. strcspn°ú °ÅÀÇ ¶È°°°í ¸¶Áö¸· ÇÑÁÙ¸¸ ´Ù¸£´Ù. extern inline char * strpbrk(const char * cs,const char * ct) { register char * __res; __asm__ __volatile__( "cld\n\t" "movl %4,%%edi\n\t" /* ctÀÇ °ªÀ» edi¿¡ ¿Å±ä´Ù. */ "repne\n\t" /* al(0)ÀÇ °ª°ú ediÀÇ °ªÀ» ¹Ýº¹ºñ±³ÇÏ¿© °°Àº°¡¸¦ */ "scasb\n\t" /* °Ë»öÇÑ´Ù. 0¹®ÀÚ¸¦ ¸¸´Ù¸é ±×´ÙÀ½À» °¡¸£Å²´Ù. */ "notl %%ecx\n\t" /* not ¿¬»êÀ¸·Î ctÀÇ ¹®ÀÚ¿­ °¹¼ö+1À» ecx¿¡ ±¸ÇÑ´Ù.*/ "decl %%ecx\n\t" /* ctÀÇ ¹®ÀÚ¿­ °¹¼ö¸¦ ±¸ÇÑ´Ù. */ "movl %%ecx,%%edx\n" /* ctÀÇ ¹®ÀÚ¿­ °¹¼ö¸¦ edx¿¡ ¹é¾÷ÇÑ´Ù. */ "1:\tlodsb\n\t" /* esi¿¡¼­ Çѹ®ÀÚ¸¦ al·Î °¡Á®¿Â´Ù. */ "testb %%al,%%al\n\t" /* alÀÌ 0ÀÎÁö¸¦ °Ë»çÇÑ´Ù. */ "je 2f\n\t" /* ¸¸ÀÏ 0ÀÌ¸é ³ÎÀ» µ¹·ÁÁÖ±â À§Çؼ­ 2f·Î ºÐ±âÇÑ´Ù.*/ "movl %4,%%edi\n\t" /* ctÀÇ °ªÀ» edi¿¡ ´Ù½Ã ¿Å±ä´Ù. */ "movl %%edx,%%ecx\n\t" /* ctÀÇ ¹®ÀÚ¿­ °¹¼ö¸¦ ecx¿¡ ´Ù½Ã ¿Å±ä´Ù.*/ "repne\n\t" /* alÀÇ ¹®ÀÚ°¡ ct¿¡ ³ªÅ¸³ª´Â Áö¸¦ ctÀÇ */ "scasb\n\t" /* °¹¼ö¸¸Å­ ã±â¸¦ ¹Ýº¹ÇÑ´Ù. */ "jne 1b\n\t" /* alÀÌ ct³»¿¡ ¾ø´Â ¹®ÀÚ¶ó¸é 1b·Î ºÐ±âÇÏ¿© ¹Ýº¹*/ "decl %0\n\t" /* ct¿¡ ³ª¿À´Â ¹®ÀÚ¸¦ ã¾ÒÀ¸¹Ç·Î esi¸¦ Çϳª°¨¼Ò ½ÃŲ´Ù.*/ "jmp 3f\n" /* Á¾·áÇÑ´Ù. */ "2:\txorl %0,%0\n" /* ³Î Æ÷ÀÎÅ͸¦ esi¿¡ µÇµ¹¸°´Ù. */ "3:" :"=S" (__res):"a" (0),"c" (0xffffffff),"0" (cs),"g" (ct) :"ax","cx","dx","di"); return __res; } * ¸ÕÀú __res°¡ char *·Î ¼±¾ðµÈ °Í¿¡ ÁÖÀÇÇÏÀÚ. ±×¸®°í esi´Â ¿ª½Ã³ª __res·Î °ªÀ» output Çϰí ÀÖÀ½À» ¾Ë ¼öÀÖ´Ù. ¸¶Áö¸·ÀÇ return __res ´Â Æ÷ÀÎÅÍ ±× Â÷ü¸¦ ¸®ÅÏÇϰí ÀÖÀ½¿¡ À¯ÀÇÇÏÀÚ. * strcspn°ú ´Þ¶óÁø Á¡Àº ´ÙÀ½°ú °°´Ù. strpbrk strcspn decl %0 2: decl %0 jmp 3f 2: xorl %0, %0 3: (end...) * xorl %0, %0Àº esi¸¦ 0À¸·Î ¸¸µç´Ù.(°á°úÀûÀ¸·Î NULL Æ÷ÀÎÅÍ·Î ¸¸µå´Â °Í ÀÌ´Ù.) * strcspn¿¡¼­ÀÇ Áß°£ÀÇ je 2f´Â esi¸¦ Çϳª °¨¼Ò½Ã۰í Á¾·áÇߴµ¥, strpb- rk¿¡¼­´Â ct¿¡ ÇØ´çÇÏ´Â ¹®ÀÚ¸¦ cs³»¿¡¼­ ¸øÃ£¾ÒÀ» °æ¿ì´Â ³¡±îÁö °¡¼­ ³ÎÀ» ¸®ÅÏÇϱâ À§ÇÏ¿© 2f·Î ºÐ±âÇÑ´Ù. xor´Â ³ÎÀ» ÀúÀåÇÑ´Ù. * ct¿¡ ³ª¿À´Â ¹®ÀÚ¸¦ cs¿¡¼­ ã¾ÒÀ» °æ¿ì´Â esi-1 (decl %0)À» ÇØ¼­ Á÷Á¢ Æ÷ÀÎÅ͸¦ ³Ñ°ÜÁØ´Ù. 2.12 strstr strstrÀº Çѹø ¾¿ »ç¿ëÇØ º¸¾ÒÀ½Á÷ ÇÏ´Ù. char *strstr(const char *cs, const char *ct); ¹®ÀÚ¿­ cs¿¡¼­ ct°¡ óÀ½À¸·Î ³ªÅ¸³ª´Â °÷ÀÇ Æ÷ÀÎÅ͸¦ µ¹·ÁÁØ´Ù. extern inline char * strstr(const char * cs,const char * ct) { register char * __res; __asm__ __volatile__( "cld\n\t" \ "movl %4,%%edi\n\t" /* ctÀÇ °ªÀ» edi¿¡ ¿Å±ä´Ù. */ "repne\n\t" /* ct°¡ °¡¸£Å°´Â °÷¿¡¼­ al(0)ÀÌ ³ª¿Ã ¶§±îÁö */ "scasb\n\t" /* °Ë»öÀ» ¹Ýº¹ÇÑ´Ù. */ "notl %%ecx\n\t" /* ctÀÇ ¹®ÀÚ¿­ °¹¼ö + 1À» ecx¿¡ ±¸ÇÑ´Ù. */ "decl %%ecx\n\t" /* ctÀÇ ¹®ÀÚ¿­ °¹¼ö¸¦ ±¸ÇÑ´Ù. */ "movl %%ecx,%%edx\n" /* ctÀÇ ¹®ÀÚ¿­ °¹¼ö¸¦ edx¿¡ ¹é¾÷ÇÑ´Ù. */ "1:\tmovl %4,%%edi\n\t" /* ct¸¦ edi¿¡ ´Ù½Ã ºÎ¸¥´Ù. */ "movl %%esi,%%eax\n\t" /* cs¸¦ eax¿¡ ¹é¾÷ÇÑ´Ù. */ "movl %%edx,%%ecx\n\t" /* ctÀÇ ¹®ÀÚ¿­ °¹¼ö¸¦ ecx¿¡ ´Ù½Ã ºÎ¸¥´Ù. */ "repe\n\t" /* cs¿Í ctÀÇ ¹®ÀÚ¸¦ ecx¸¸Å­ Çϳª¾¿ */ "cmpsb\n\t" /* Çϳª¾¿ ºñ±³Çϱ⸦ ¹Ýº¹ÇÑ´Ù. */ "je 2f\n\t" /* °°´Ù¸é Á¾·áÇÑ´Ù. ÇöÀç eax¿¡´Â esi°¡ ÀúÀå */ "xchgl %%eax,%%esi\n\t" /* °°Áö ¾Ê´Ù¸é eax¿Í esiÀÇ °ªµéÀ» ±³È¯ÇÑ´Ù. */ "incl %%esi\n\t" /* ´ÙÀ½ºñ±³¸¦ À§Çؼ­ esi¸¦ Çϳª Áõ°¡½ÃŲ´Ù. */ "cmpb $0,-1(%%eax)\n\t" /* eax°¡ °¡¸£Å°´Â °÷ÀÇ ¹Ù·Î ¾ÕÀÌ 0ÀÎÁö °Ë»ç */ "jne 1b\n\t" /* 0ÀÌ ¾Æ´Ï¶ó¸é ºñ±³¸¦ ¹Ýº¹ÇÑ´Ù. */ "xorl %%eax,%%eax\n\t" /* 0À̶ó¸é eax¿¡ ³ÎÀ» µÇµ¹¸°´Ù. */ "2:" :"=a" (__res):"0" (0),"c" (0xffffffff),"S" (cs),"g" (ct) :"cx","dx","di","si"); return __res; } * commands ¿¡¼­ °ªÀ» º¸Á¸Çϱâ À§Çؼ­ ÀúÀå°ú ±³È¯ÀÌ ÀÚÁÖ ÀϾ´Â µ¥ À̰͸¸ ÀÚ¼¼È÷ º¸¸é ÀÌÇØ°¡ °¥ °ÍÀÌ´Ù. * ¸ÕÀú outputÀÌ eax¸¦ ÅëÇØ¼­ __res¿¡ Àü´Þ µÈ´Ù´Â Á¡¸¸ »©°í´Â inputÀ̳ª registers Çʵ嵵 º° ´Ù¸¦ °Ô ¾ø´Ù. * commands¿¡¼­ xchg´Â µÎ°³ÀÇ °ªÀ» ±³È¯ÇÏ´Â opcodeÀÌ´Ù. À̹ø¿¡´Â ºÎºÐ ºÎºÐ¾¿ ©¶ó¼­ º¸ÀÚ. ¾ÕºÎºÐºÎÅÍ.. cld movl %4, %%edi /* ct -> edi */ repne scasb notl %%ecx decl %%ecx movl %%ecx, %%edx ¿©±â±îÁö´Â ctÀÇ ¹®ÀÚ¿­ °¹¼ö¸¦ ecx¿¡ ±¸Çؼ­ edx¿¡ ¹é¾÷ÇÏ´Â °úÁ¤À¸·Î À§¿¡¼­ º» ¹Ù¿Í °°´Ù. 1: movl %4, %%edi /* ct -> edi */ movl %%esi, %%eax /* esi(cs) -> eax */ movl %%edx, %%ecx /* esi¿Í edi¸¦ ºñ±³¸¦ ¹Ýº¹ÇÒ È½¼ö */ repe /* ºñ±³ ½ÇÇà */ cmpsb je 2f xchgl %%eax, %%esi incl %%esi cmpb $0, -1(%%eax) jne 1b xorl %%eax, %%eax /* ³ÎÀ» ¸¸µç´Ù. */ 2: (end..) ct(esi)ÀÇ °ªÀ» edi¿¡ ´Ù½Ã ÀúÀåÇÏ´Â ÀÌÀ¯´Â ÀÌÀü¿¡ edi°¡ º¯°æµÇ¾ú±â ¶§¹® ÀÌ´Ù. esi´Â ÀÌÈÄÀÇ ºñ±³·çƾ ¼Ó¿¡¼­ º¯°æÀÌ µÇ±â ¶§¹®¿¡ eax¿¡ Çѹø¾¿ ºñ ±³¸¦ ÇϱâÀü¿¡ ¹é¾÷À» ÇØµÐ´Ù. movl %%edx, %%ecx·Î ctÀÇ ¹®ÀÚ¿­ ±æÀ̸¦ esi¿Í edi¸¦ ºñ±³Çϱâ À§ÇÑ ¹Ýº¹ Ƚ¼ö·Î ecx¿¡ ¿Å±ä´Ù. ÀÌÈÄ¿¡¼­ ecx´Â °è¼Ó º¯°æµÇ±â ¶§¹®¿¡ edx°¡ ±× °ªÀ» °è¼Ó º¸°üÇϰí ÀÖ´Ù. repe cmpsb´Â edi¿Í esi°¡ °¡¸£Å°´Â °÷ÀÇ ¹®ÀÚ¸¦ ¼­·Î ºñ±³¸¦ ÇØ¼­ °°À¸¸é zf¸¦ 1·Î ¼¼Æ®ÇÑ´Ù. je 2f´Â ¹®ÀÚ¿­ÀÌ ¼­·Î °°À¸¸é ³¡À» ³½´Ù. À̶§ eax¿¡´Â esiÀÇ Ã¹ Æ÷ÀÎÅÍ °¡ ÀÖÀ¸¹Ç·Î Á¤»óÀûÀÎ ¹Ýȯ°ªÀÌ µÈ´Ù. esi´Â ¼¼ºÎºñ±³ ·çƾ¼Ó¿¡¼­µµ °è¼Ó º¯Çϰí ÀÖ´Â »óÅÂÀ̹ǷΠÀ¯µ¿ÀûÀÎ °ªÀÌ µÈ´Ù. xchgl %%eax, %%esi´Â ¼­·ÎÀÇ °ªÀ» ±³È¯ÇÑ´Ù. Áï, eaxÀÇ °ªÀ» esi¿¡ ³Ö´Â °ÍÀÌ Áß¿äÇÏ´Ù. eax¿¡´Â ¼¼ºÎºñ±³ ÀÌÀüÀÇ Æ÷ÀÎÅÍ ÀÓÀ» »ó±âÇÏÀÚ. incl %%esi´Â cs°¡ °¡¸£Å°´Â ¼Ó¿¡¼­ esi¸¦ Çϳª Áõ°¡½ÃÄÑ ´ÙÀ½¹®ÀÚ¸¦ °¡ ¸£Å°µµ·Ï ÇÑ´Ù. ¿©±â¼­ Áß¿äÇÑ °ÍÀº cs¿¡¼­ ³Î¹®ÀÚ¸¦ °Ë»öÇÏ´Â °úÁ¤ÀÌ´Ù. cmpb $0, -1(%%eax) ¿©±â¼­ eax´Â xchg°¡ ÀϾ±â ÀüÀÇ esiÀÇ °ªÀÌ´Ù. esi´Â cs³»¿¡¼­ ¿ò Á÷À̹ǷΠ-1(%%eax)´Â eax-1°ú °°°í À̰ÍÀº ¹Ù·Î Àü ¼¼ºÎºñ±³ ·çƾ¿¡¼­ esi°¡ ¸¶Áö¸·À¸·Î °¡¸£Å² °ªÀÇ ¹Ù·Î¾ÕÀ» °¡¸£Å²´Ù. À̰ÍÀÌ 0À̸é csÀÇ ³Î¹®ÀÚ¸¦ °¡¸£Å°¹Ç·Î ãÁö ¸øÇß´Ù´Â °ÍÀ̹ǷΠjne 1b¸¦ Åë°úÇÏ¿© xor ¸¦ »ç¿ëÇÏ¿© eax¿¡ 0À» ÀúÀåÇÏ¿© NULL Æ÷ÀÎÅ͸¦ ¸®ÅÏÇÑ´Ù. ¸¸ÀÏ cmpb¿¡¼­ 0ÀÌ ¾Æ´Ï¸é 1b·Î ºÐ±âÇÏ¿© edi, eax, ecx¿¡ °¢°¢ ÇÊ¿äÇÑ °ªµéÀ» ¿Å±â°í ÀúÀåÇÏ¿© ·çÇÁ¸¦ ¹Ýº¹ÇÑ´Ù. Áï, 1: ÀÌÈÄ¿¡¼­´Â edi¿¡´Â ct°¡, eax´Â ct³»¿¡¼­ ÇѹøÀÇ ¿ÜºÎºñ±³¸¦ Çϱâ À§ÇØ ct³»¿¡¼­ÀÇ ¿É¼ÂÀ» ÀúÀåÇÏ´Â ¿ªÇÒÀ» Çϰí, edx´Â ¼¼ºÎºñ±³ ÀÇ ¹Ýº¹È½¼öÀÇ ¹é¾÷¿ëµµ·Î, ecx´Â ¼¼ºÎºñ±³ Ƚ¼öÀÇ ¿ëµµ·Î »ç¿ëµÈ´Ù. ±×¸®°í Áß°£¿¡ eax¿Í esiÀÇ °ªÀÇ ±³È¯ÀÌ Çѹø ÀϾ´Ù. ¹ÝȯÀº eax ¸¦ »ç¿ëÇÑ´Ù. ¸Å¹øÀÇ eaxÀÇ ¿òÁ÷ÀÓÀ» Àß »ìÆìº¸¶ó. ÀÌÁ¦, Á¤È®È÷ ÀÌÇØ°¡ µÇ´Â°¡? ±×·³, ´ÙÀ½À¸·Î ³Ñ¾î°¡ÀÚ.. :-) 2.13 strlen ¾Æ¸¶ Áö±ÝÂë ±ä¼ûÀ» ½¬´Â ºÐµéÀÌ ¸¹À» °ÍÀÌ´Ù. Àá½Ã ½¬¾ú´Ù ÇÏÀÚ. strlenÀº ³Ê¹« °£´ÜÇϹǷΠ´ã¹è¸¦ ÇÑ´ë ºÙ¿©¼­ ÇÇ¿ì¸é¼­ ÇØµµ ±× ´ã¹è°¡ ´Ù Ÿµé¾î°¡±â Àü¿¡ ÀÌÇØ¸¦ ´Ù ¸¶Ä¡°í À̹ø ½Ã°£À» ¸¶°¨ ÇÒ °ÍÀÌ´Ù. extern inline size_t strlen(const char * s) { register int __res; __asm__ __volatile__( "cld\n\t" "repne\n\t" "scasb\n\t" /* al(0)ÀÇ °ª°ú edi°¡ °¡¸£Å°´Â °ªÀ» ºñ±³ÇÑ´Ù. */ "notl %0\n\t" /* ecx¿¡ sÀÇ ¹®ÀÚ¿­ ±æÀÌ + 1À» ±¸ÇÑ´Ù. */ "decl %0" /* sÀÇ ¹®ÀÚ¿­ ±æÀ̸¦ ecx¿¡ ±¸ÇÑ´Ù. :"=c" (__res):"D" (s),"a" (0),"0" (0xffffffff):"di"); return __res; } * output Àº ecx¸¦ ÅëÇØ¼­ __res¿¡ Àü´ÞµÇ°í, edi ¿¡´Â s¸¦, eax ¿¡´Â 0ÀÌ, ecx¿¡´Â 0xffffffff°¡ Àü´ÞµÈ´Ù. edi´Â »ç¿ëÀ» ÇϹǷΠÄÄÆÄÀÏ·¯¿¡°Ô ÀûÀýÇÑ º¸°ü Áö½Ã¸¦ ³»¸°´Ù. * ¾Õ¿¡¼­ ¸¹ÀÌ º¸¾Æ¿À´ø ºÎºÐÀ̹ǷΠ½±°Ô ÀÌÇØ°¡ °¥ °ÍÀÌ´Ù. * input Çʵ忡¼­ C¿¡¼­ÀÇ º¯¼ö°ªÀ» ¾î¶»°Ô ÀûÀýÈ÷ ÇØ´ç ·¹Áö½ºÅÍ¿¡ Àü´ÞÇÏ´Â Áö¸¦ Àß º¸±â ¹Ù¶õ´Ù. (À̰ÍÀ¸·Î À̹ø½Ã°£Àº ¸¶Ä¡°Ú´Ù. ´ÙÀ½ ½Ã°£¿¡´Â string.h¿¡¼­ °¡Àå ºÐ·® ÀÌ ¸¹Àº strtok¸¦ »ìÆìº¸°Ú´Ù. ¹Ì¸® C·çƾÀ» Çѹø »ý°¢ÇØ º»´Ù¸é ÀÌÇØ °¡ ºü¸¦ °ÍÀÌ´Ù. ) ddoch Çѵ¿ÈÆ