pr 400 PRINTER/CAPTURE °¡ ÁغñµÇ¾ú½À´Ï±î(Y/n) ? ¡º¸®´ª½º Çдç-¸®´ª½º °­Á / ¿¬Àç (go LINUX)¡» 400¹ø Á¦ ¸ñ:[°­ÁÂ01] ÀζóÀÎ ¾î¼Àºí¸®¸¦ ºÐ¼®ÇÏÀÚ! ¿Ã¸°ÀÌ:ddoch (Çѵ¿¿í ) 97/02/18 22:08 ÀÐÀ½:2701 °ü·ÃÀÚ·á ¾øÀ½ ----------------------------------------------------------------------------- --------------------------------------------------------------- °­Á : ÀζóÀÎ ¾î¼Àºí¸®¸¦ ºÐ¼®ÇÏÀÚ. --------------------------------------------------------------- -- ºÎÁ¦ : /usr/src/linux/include/asm-i386/string.h ºÐ¼® ÀÌ¾ß±â ²Û : Çѵ¿ÈÆ ÀÎÅÍ³Ý ¸ÞÀÏ: ddoch@hitel.kol.co.kr ddoch@nownuri.nowcom.co.kr À̾߱⠳¯Â¥: 1997³â 2¿ù 28ÀÏ ---------------------------------------------------------------- 1. µé¾î°¡´Â ¸» GNU C( ¸®´ª½ºÀÇ gcc, µµ½ºÀÇ djgpp µî)ÀÇ ÀζóÀÎ ¾î¼Àºí¸®´Â tasm µîÀÇ ¹®¹ý°ú Á¶±Ý Â÷ÀÌ°¡ ³­´Ù. GNU C¿¡¼­ÀÇ ÀζóÀÎ ¾î¼Àºí¸®, ¿ÜºÎ ¾îºí¸®¾î´Â AT&T¿¡ ±â¹ÝÇÑ ¹®¹ýÀ» ÃëÇÔÀ¸·Î½á masm, tasmµîÀÇ INTEL¹® ¹ý°ú´Â Á¶±Ý Â÷ÀÌ°¡ ³ª´Â °ÍÀÌ´Ù. ÀÚ¼¼ÇÑ ¹®¹ý»óÀÇ Â÷ÀÌ´Â ¿©·¯Â÷·Ê ¹ø¿ªÇÏ¿© ¿Ã·Áµå¸° AT&T °ü·Ã ¾î¼Àºí¸® HOWTO, GUIDE¸¦ º¸½Ã±â ¹Ù¶õ ´Ù. ÀÏ´Ü ¿©±â¼­´Â ¸®´ª½º Ä¿³Î¼Ò½º¾È¿¡ À§Ä¡ÇÑ "/usr/src/linux/include/ asm-i386/string.h"¸¦ »ìÆ캼 °ÍÀÌ´Ù. ÀζóÀÎ ¾î¼Àºí¸®·Î ¸¸µé¾î Á³À¸ ¸ç ¿ì¸®°¡ Àͼ÷ÇÑ C ÇÔ¼ö¶ó ºñ±³Àû ½±°Ô ÀÌÇØ°¡ °¥ °ÍÀ̱⠶§¹®ÀÌ´Ù. ¾ÆÁÖ °¨Ä¥¸À ³ª´Â ¿¹Á¦°¡ ¾Æ´Ò ¼ö ¾ø´Ù. :-) GNU CÀÇ ÀζóÀÎ ¾î¼Àºí¸®¾î´Â ´ÙÀ½°ú °°ÀÌ ÀÌ·ç¾îÁ® ÀÖ´Ù. asm("commands" : output : input : registers); asm ´ë½Å¿¡ __asm__ Å°¿öµå¸¦ »ç¿ëÇصµ µÇ¸ç, __volatile__ Å°¿öµå ´Â ÀÏ´Ü ½Å°æ ¾²Áö ¸¶½Ã±â ¹Ù¶õ´Ù. __volatile__Àº ÄÄÆÄÀÏ·¯·Î ÇÏ ¿©±Ý ÇØ´ç ±¸¹®¿¡ ´ëÇØ ÇԺηΠÀÚÀÇÀûÀ¸·Î ¼öÁ¤,Çؼ® ÇÏÁö ¸øÇϵµ ·Ï ÇÏ´Â ±¸½ÇÀ» ÇÑ´Ù. ¿©±â¼­ÀÇ ºÐ¼®Àº ÀÚ¿¬½º·´°Ô ÇÁ·Î±×·¥À» ÀÌÇØÇϱâ À§Çؼ­ input, registers, commands, output ÀÇ ¼ø¼­¸¦ ÃëÇÒ °ÍÀÌ´Ù. ±×¸®°í ¼³¸íÀÇ ÆíÀǸ¦ À§Çؼ­ AT&T ¹®¹ý°ú INTEL ¹®¹ýÀ» ÀûÀýÈ÷ È¥¿ëÇÏ°Ú´Ù. ¼³¸íÁß di/edi¸¦ di³ª edi·Î Ç¥±âÇϰųª si/esi¸¦ si, esi·Î ´ëÇ¥ÇÏ¿© Ç¥±â ÇÏ´Â °æ¿ì°¡ Á¾Á¾ ÀÖ´Ù. ÀÚ, ÀÌÁ¦ Á¶±ÝÀÇ ÈïºÐµÇ´Â ¸¶À½À» °¡¶ó¾ÉÈ÷°í ¿©ÇàÀ» ¶°³ªº¸ÀÚ. 2. string.h ºÐ¼® 2.1 strcpy strcpy´Â C¸¦ Çغ» »ç¶÷¿¡°Ô´Â Á¤¸» ³·ÀÍÀº °ÍÀÌ´Ù. ¾î¶»°Ô ³»ºÎÀû À¸·Î ¾î¼Àºí¸®¾î·Î Ç¥ÇöµÉ ¼ö ÀÖ´Â Áö »ìÆ캸ÀÚ. extern inline char * strcpy(char * dest,const char *src) { __asm__ __volatile__( "cld\n" "1:\tlodsb\n\t" "stosb\n\t" "testb %%al,%%al\n\t" "jne 1b" : /* no output */ :"S" (src),"D" (dest):"si","di","ax","memory"); return dest; } * ¸ÕÀú input ºÎºÐÀ» º¸¸é movl src, %%esi movl dest, %%edi Áï, src Æ÷ÀÎÅÍ´Â esi(source index)·Î ¿Å±â¸ç, destÆ÷ÀÎÅÍ´Â edi(dest index)·Î ¿Å±ä´Ù. Ç×»ó ¿ø·¡ÀÇ Æ÷ÀÎÅÍ´Â esi/si·Î ¿Å °ÜÁö¸ç À̵¿½ÃÅ°°Å³ª ÀÛ¾÷ÇÒ ´ë»ó Æ÷ÀÎÅÍ´Â edi/di·Î ¿Å±â´Â °ÍÀ» ÀÌÈÄ ¿¡¼­µµ ÀÚÁÖ º¼ ¼ö ÀÖ´Ù. * registers ºÎºÐÀº si, di, ax ·¹Áö½ºÅÍ¿Í ÇØ´çÇÏ´Â ¸Þ¸ð¸®¸¦ »ç ¿ëÇϹǷΠÇÊ¿äÇϸé ÄÄÆÄÀÏ·¯¿¡°Ô ÇØ´çÇÏ´Â ·¹Áö½ºÅÍ/¸Þ¸ð¸®ÀÇ °ªµéÀÌ ¼Õ»óµÇÁö ¾Êµµ·Ï, push/ popÀÛ¾÷À» Çϵµ·Ï Áö½ÃÇÏ´Â °ÍÀÌ´Ù. ÀÌ·¸°Ô ÇÔ À¸·Î½á ¿ì¸®´Â °ªµéÀÌ º¯ÁúµÇ´Â °ÍÀ» ¸·±âÀ§ÇÏ¿© push/popÀ» ÇÒ ³ë°í¸¦ µé ¼ö ÀÖ´Ù. * cld ´Â ¹æÇâÇ÷¡±×(df)¸¦ 0À¸·Î Ŭ¸®¾îÇÏ¿© Á¤¹æÇâ ÁøÇàÀÌ ÀÌ·ç¾îÁø´Ù. ---------------------------------------------------------------------- Ç÷¡±× 0À¸·Î Ŭ¸®¾î 1·Î ¼¼Æ® ---------------------------------------------------------------------- ij¸® Ç÷¡±×(cf) clc stc ¹æÇâ Ç÷¡±×(df) cld std ÀÎÅÍ·´Æ®Ç÷¡±×(if) cli sti ---------------------------------------------------------------------- * lodsb/lodsw/lodsd (Load String Byte/Word/Double) ¹ÙÀÌÆ®/¿öµå/´õºí¿öµåÀÇ ÀڷḦ esi°¡¸£Å°´Â °÷À¸·Î ºÎÅÍ Àоî¿Í¼­ al/ax /eax ·¹Áö½ºÅÍ¿¡ Àü¼Û½ÃŲ´Ù. Àü¼ÛµÈ ÈÄ esi´Â ´ÙÀ½¹ø ¹®ÀÚ¿­ ¿ä¼Ò¸¦ °¡¸£ Å°µµ·Ï °»½ÅµÇ´Â µ¥, dfÀÌ 0À̸é 1/2/4¸¸Å­ Áõ°¡µÇ°í, df°¡ 1À̸é 1/2/4 ¸¸Å­ °¨¼ÒµÈ´Ù. Áï, ¿©±â¼­ÀÇ lodsb´Â esi°¡ °¡¸£Å°´Â °÷À¸·ÎºÎÅÍ 1¹ÙÀÌÆ®¸¦ Àоî¿Í¼­ al¿¡ ÀúÀåÇÑ´Ù. * stosb/stosw/stosd (Store String Byte/Word/Double) al/ax/eax ·¹Áö½ºÅÍÀÇ °ªÀ» edi°¡ °¡¸£Å°´Â °÷¿¡ º¹»çÇÑ´Ù. º¹»çÈÄ edi ÀÇ °ªÀº ´ÙÀ½¹ø ¹ÙÀÌÆ®/¿öµå/´õºí¿öµå¸¦ °¡¸£Å°µµ·Ï °»½ÅµÈ´Ù. ¿©±â¼­ ÀÇ stosb´Â ÀÌ¹Ì Àоî¿Â alÀÇ °ªÀ» edi°¡ °¡¸£Å°´Â °÷À¸·Î º¹»ç¸¦ ÇÑ´Ù. * test (Logical Compare) op1°ú op2¿¡ ´ëÇØ ºñÆ® & ¿¬»êÀ» ÇÏ¿© ±× °á°ú¿¡ µû¶ó °¢ Ç÷¡±×ÀÇ °ªÀ» º¯°æÇÑ´Ù. opÀÇ °ªÀÌ º¯ÇÏÁö ¾Ê´Â´Ù´Â Á¡À» Á¦¿ÜÇÏ°í´Â and ¸í·É°ú µ¿ ÀÏÇÏ´Ù. mov ah, 1010 0111b test ah, 1111 0000b -------------------- 1010 0000b test ÀÇ °á°ú´Â 1010 0000b(a0h)ÀÌ´Ù. ÃÖ»óÀ§ ºñÆ®°¡ 1À̹ǷΠsf(sign flag) °¡ 1·Î ¼¼Æ®µÇ°í, a0h´Â 0ÀÌ ¾Æ´Ï¹Ç·Î zf(zero flag)ÀÌ 0À¸·Î Ŭ¸®¾îµÈ´Ù. ah°ªÀº º¯È­°¡ »ý±âÁö ¾Ê´Â´Ù. zf°¡ 1·Î µÇ·Á¸é °è»ê°á°ú°¡ 0À̾î¾ß ÇÑ´Ù. À§ÀÇ ¿¹¿¡¼­ testb %%al, %%al°ú °°ÀÌÇϸé Ç×»ó °è»ê°á°ú°ªÀº ÀÚ±âÀÚ½Å(¿©±â ¼­´Â al)ÀÌ µÈ´Ù. ÀÌÇØ°¡ ¾ÈµÇ½Ã´Â ºÐÀ» À§Çؼ­.. 1010 0111 1010 0111 ----------- 1010 0111 µû¶ó¼­ À§ÀÇ testb¹®Àº alÀÇ ÃÖ»óÀ§ºñÆ®°¡ 1À̸é sf¸¦ 1·Î ¼¼Æ®ÇÏ°í ¾Æ´Ï¸é 0À¸·Î Ŭ¸®¾î ÇÒ °ÍÀÌ°í, alÀÇ °ªÀÌ 0À̸é zf¸¦ 1·Î ¼¼Æ®ÇÒ °ÍÀÌ´Ù. ÀÌ ±¸¹®ÀÇ ¸ñÀûÀº alÀÌ 0ÀÎÁö ¾Ë¾Æº¸´Â °ÍÀÌ´Ù. * jne ¿Í ÀÏ·ÃÀÇ opcodes (Conditional Jump) ÇöÀçÀÇ °¢ Ç÷¡±×ÀÇ »óÅ¿¡ µû¶ó ½ÇÇàÀ» labelÀÇ À§Ä¡·Î ºÐ±â½ÃŲ´Ù. ---------------------------------------------------------- ¸í·É ºÐ±â Á¶°Ç ---------------------------------------------------------- jb / jnae / jc cf = 1 jbe / jna cf = 1 À̰ųª zf = 1 je / jz zf = 1 jecxz ecx = 0 jl / jnge sf != of jle / jng sf != of ¶Ç´Â zf = 1 jnb / jae / jnc cf = 0 jnbe / ja cf = 0 À̸ç zf = 0 jne / jnz zf = 0 jnl / jge sf = of jnle / jg zf = 0 À̸ç sf = of jno of = 0 jnp / jpo pf = 0 jns sf = 0 jo of = 0 jp / jpe pf = 1 js sf = 1 ---------------------------------------------------------- ( less¿Í greater´Â ºÎÈ£¼öÄ¡(Signed Number)ÀÎ °æ¿ìÀÇ ºñ±³, above¿Í below´Â ºñºÎÈ£¼öÄ¡(Unsigned Number)ÀÎ °æ¿ìÀÇ ºñ±³ ) À§ÀÇ ¿¹¿¡¼­ jne´Â zf°¡ 0ÀÏ °æ¿ì, Áï alÀÌ 0ÀÌ ¾Æ´Ò °æ¿ì ÇØ´çÀ§Ä¡·Î ºÐ±âÇÑ´Ù. ¶óº§Àº '1:'¿Í °°ÀÌ Àû°í, ÈÄÁøÂüÁ¶ÀÏ °æ¿ì´Â 'b', ÀüÁøÂüÁ¶ ÀÏ °æ¿ì´Â 'f'¸¦ ºÐ±âÇÏ°íÀÚ ÇÏ´Â ¶óº§µÚ¿¡ ºÙÀδÙ. À§ÀÇ ¿¹¿¡¼­ esi(src)¿¡¼­ 1¹ÙÀÌÆ®¸¦ Àоî¿Í¼­ ¸ÕÀú edi(dest)¿¡ Àû°í 0ÀÌ ¾Æ´Ò°æ¿ì °è¼Ó º¹»çÀÛ¾÷À» ¹Ýº¹ÇÏ°í 0ÀÏ °æ¿ì ·çÇÁ¸¦ Á¾·áÇÑ´Ù. Áï, ¸Þ¸ð¸®¿¡ ´ëÇÑ ¾²±â ÀÛ¾÷ÀÌ ·¹Áö½ºÅ͸¦ ÅëÇؼ­ ¸¶Áö¸· ³Î¹®ÀÚ '\0' ±îÁö º¹»ç¸¦ ÇÏ°í ³­ µÚ¿¡´Â Á¾·á¸¦ ÇÑ´Ù´Â À̾߱âÀÌ´Ù. ¾î¶²°¡? strcpyÀÇ Àú±Þ Çൿ¾ç½ÄÀÌ ´«¿¡ µé¾î¿ÀÁö ¾Ê´Â°¡? À§¿¡¼­ ¼³¸íÇÑ opcodesµéÀº ÀÌÈÄ¿¡µµ ÁÙ±âÂ÷°Ô ³ª¿Â´Ù. ±×·³, strncpy·Î ³Ñ¾î°¡ÀÚ. 2.2 strncpy extern inline char * strncpy(char * dest,const char *src,size_t count) { __asm__ __volatile__( "cld\n" "1:\tdecl %2\n\t" "js 2f\n\t" "lodsb\n\t" "stosb\n\t" "testb %%al,%%al\n\t" "jne 1b\n\t" "rep\n\t" "stosb\n" "2:" : /* no output */ :"S" (src),"D" (dest),"c" (count):"si","di","ax","cx","memory"); return dest; } * ¸ÕÀú input Çʵ带 º¸ÀÚ. movl src, %%esi movl dest, %%edi movl count, %%ecx ¸ÕÀú¿Í ´Þ¶óÁø Á¡Àº count ¸¦ ecx¿¡ ¿Å±ä °Í »ÓÀÌ´Ù. * registers ÇʵåÀÇ si, di, ax, cx, memory´Â Á÷Á¢ÀûÀ¸·Î »ç¿ëÀ» ÇÑ´Ù´Â °ÍÀ» ÄÄÆÄÀÏ·¯¿¡°Ô ¾Ë·ÁÁÖ¾î ±× °ªÀ» º¸È£Çϵµ·Ï ÇÑ´Ù. * ÀÌÁ¦ commands Çʵ带 Çϳª¾¿ º¸ÀÚ. * ¿ª½Ã cld·Î ¹æÇâÇ÷¡±×(df)¸¦ 0À¸·Î Ŭ¸®¾îÇÏ¿´´Ù. * output, inputÀÇ ÇÇ¿¬»êÀÚµéÀº ¼ø¼­´ë·Î %0, %1..·Î commandsÇÊµå ¿¡¼­ ÂüÁ¶ÇÒ ¼ö ÀÖ´Ù. À§¿¡¼­´Â, outputÀº ¾øÀ¸¹Ç·Î input ÇʵåÀÇ °¢°¢À» %0(esi), %1(%edi), %2(ecx)·Î commands Çʵ忡¼­ ÂüÁ¶ÇÒ ¼ö ÀÖ°Ô µÈ´Ù. * dec / inc opÀÇ °ªÀ» 1¸¸Å­ °¨¼Ò/Áõ°¡ ½ÃŲ´Ù. °¨¼Ò ÈÄÀÇ °á°ú¿¡ µû¶ó °¢ Ç÷¡±× ÀÇ °ªÀÌ ¼¼ÆõȴÙ. op´Â ºñºÎÈ£¼öÄ¡·Î °£ÁֵȴÙ. cf´Â decÀÇ ¿µÇâÀ» ¹ÞÁö ¾Ê´Â´Ù. cfµµ °»½ÅÇÏ·Á¸é subl $1, op ¸¦ »ç¿ëÇÏ¸é µÈ´Ù. À§ÀÇ ¿¹, decl %2 ´Â ecxÀÇ °ªÀ» 1 °¨¼Ò½ÃŲ´Ù. * js ´Â sf = 1 ÀÏ °æ¿ì, Áï ecx°¡ À½¼öÀÏ °æ¿ì ÇØ´ç ¶óº§·Î °Ç³Ê¶Ú´Ù. * lodsb ·Î esi°¡ °¡¸£Å°´Â °÷¿¡¼­ 1¹ÙÀÌÆ®¸¦ °¡Á®¿Í¼­ al·Î ¿Å±ä´Ù. * stosb ´Â alÀÇ °ªÀ» edi°¡ °¡¸£Å°´Â °÷À¸·Î 1¹ÙÀÌÆ®¸¦ ¿Å±ä´Ù. * testb %%al, %%al ·Î alÀÇ °ªÀÌ 0ÀÎÁö °Ë»çÇÑ´Ù. * jne ´Â À§ÀÇ °è»ê°á°ú °ªÀÌ 0ÀÌ ¾Æ´Ï¸é ¶óº§ 1: ·Î °¡¼­ ·çÇÁ¸¦ ¹Ý º¹ÇÑ´Ù. * rep (Repeat) ¹®ÀÚ¿­ ó¸® ¸í·ÉÀ» cx (cl/cx/ecx) ·¹Áö½ºÅÍÀÇ °ª¸¸Å­ ¹Ýº¹ ¼öÇà½ÃŲ´Ù. ¸í·É Á¾·áÈÄ cx´Â 0ÀÌ µÈ´Ù. cld movl $3, %%ecx rep movsb si°¡ °¡¸£Å°´Â °÷ÀÇ 3¹ÙÀÌÆ®¸¦ di°¡ °¡¸£Å°´Â °÷¿¡ º¹»çÇÑ´Ù. º¹»çÈÄ si ¿Í di¸¦ 3¸¸Å­ Áõ°¡ÇÏ°í cx´Â 0ÀÌ µÈ´Ù. ctd movl $3, %%ecx rep movsw si°¡ °¡¸£Å°´Â °÷ÀÇ 3¿öµå¸¦ di°¡ °¡¸£Å°´Â °÷¿¡ º¹»çÇÑ´Ù. º¹»çÈÄ si¿Í di´Â 3*2 ¸¸Å­ °¨¼ÒÇÏ°í cx´Â 0À̵ȴÙ. À§ÀÇ ¿¹¿¡¼­ÀÇ rep, stosb´Â alÀÇ °ªÀ» di·Î cx°ª¸¸Å­ ¹Ýº¹ÇÏ¿© ¿Å±ä´Ù. ÀÌ ±¸¹®Àº strncpy¿¡¼­ src¿¡¼­ dest·Î ¹Ýº¹È¸¼ö ¸¸Å­ º¹»ç¸¦ ä ³¡³»±â µµ Àü¿¡ 0À» ¸¸³µÀ» ¶§¿¡ ÇÊ¿äÇÑ °ÍÀÌ´Ù. Áï À̶§¿¡´Â ³²Àº Ƚ¼ö¸¸Å­ al ÀÇ 0À» di(dest)¿¡ ¾²°Ô µÈ´Ù. * ¿ä¾àÀ» ÇÏÀÚ¸é °¢°¢ÀÇ ¾Æ±Ô¸ÕÆ®¸¦ input Çʵ忡¼­ esi, edi, ecx¿¡ ÀúÀåÇÑ ÈÄ ecx°¡ 0ÀÌÇÏÀÌ¸é ¾Æ¹« ÀÛ¾÷µµ ÇÏÁö ¾Ê°í js 2f·Î ÀÎÇØ ³¡ÀÌ ³ª°í, 0ÀÌ »óÀ̸é esi(src)°¡ °¡¸£Å°´Â °÷À¸·Î ºÎÅÍ Çϳª¾¿ al¿¡ °¡Á®¿Í¼­ 0ÀÌ ¾Æ´Ò µ¿¾È ·çÇÁ¸¦ ¹Ýº¹ÇÏ¿© º¹»çÇÑ´Ù. ¸¸ÀÏ ¹Ýº¹È½¼ö µ¿¾È src(esi)°¡ °¡¸£Å°´Â °÷¿¡¼­ ³Î¹®ÀÚ '\0'ÀÌ ³ª¿ÀÁö ¾Ê´Â ´Ù¸é dest(edi)¿¡ ³Î¹®ÀÚ¸¦ Ãß°¡ÇÏÁö ¾Ê´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. ¹Ýº¹È¸¼ö°¡ ´Ù µÇÁöµµ ¾Ê¾Ò´Â µ¥ ³Î¹®ÀÚ°¡ ³ª¿Â´Ù ¸é alÀº 0ÀÌ µÉ °ÍÀÌ°í jne 1b¸¦ Åë°úÇÏ¿© rep, stosb°¡ ½ÇÇàÀÌ µÇ¾î¼­ alÀÇ °ª 0ÀÌ ³ª¸ÓÁö ³²Àº ¹Ýº¹È½¼ö ¸¸Å­ dest(edi)¿¡ ¾²¿©Áö´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. ¸î°¡Áö ¿¹¸¦ µé¾î ·çÇÁ¸¦ µ¹·Áº¸¸é Á¤È®ÇÏ°Ô µ¿ÀÛÇÔÀ» ¾Ë ¼ö ÀÖ´Ù. 2. 3 strcat extern inline char * strcat(char * dest,const char * src) { __asm__ __volatile__( "cld\n\t" "repne\n\t" "scasb\n\t" "decl %1\n" "1:\tlodsb\n\t" "stosb\n\t" "testb %%al,%%al\n\t" "jne 1b" : /* no output */ :"S" (src),"D" (dest),"a" (0),"c" (0xffffffff):"si","di","ax","cx"); return dest; } * input Çʵå´Â ´ÙÀ½°ú °°´Ù. movl src, %%esi /* ¿øº» ¹®ÀÚ¿­ÀÌ ÀÖ´Â °÷ */ movl dest, %%edi /* º¹»çÇÒ ´ë»ó */ movb $0, %%al /* ãÀ» ¹®ÀÚ */ movl $0xffffffff, %%ecx /* ¹Ýº¹ Ƚ¼ö */ ecx¿¡ ¿Ö ÇÊ¿ä¾øÀ» °Í °°Àº ¼öÄ¡¸¦ ÀúÀåÇÏ´Â °É±î? ¹Ù·Î À§¿¡¼­ dest(edi) ¿¡¼­ 0À» ã´Â µ¥ ÇÊ¿äÇÑ È½¼ö¸¦ ´ë·«ÀûÀ¸·Î Àâ¾ÆÁÖ´Â °ÍÀ¸·Î ¾²ÀδÙ. * ¿ª½Ã³ª registers Çʵ忡´Â ÀÌ ÇÁ·Î±×·¥¿¡¼­ »ç¿ëµÇ´Â ·¹Áö½ºÅÍ°¡ ±â¼úµÇ ¾î ÀÖ´Ù. * repne / repnz / repe / repz -- repne / repnz (Repeat while Nat Equal/Zero) ¹®ÀÚ¿­ ó¸® ¸í·ÉÀ» cx ·¹Áö½ºÅÍÀÇ °ª¸¸Å­ ¶Ç´Â zfÀÌ 1ÀÌ µÉ ¶§±îÁö (Áï, ¹®ÀÚ³ª °ªÀÌ ¼­·Î ´Ù¸¦ °æ¿ì-zf°¡ 0ÀÎ °æ¿ì-¿¡´Â cx °ª¾È¿¡¼­ ¹Ýº¹ÇÑ´Ù) ¹Ýº¹ ½ÇÇà½ÃŲ´Ù. repnz°ú repne¸í·ÉÀº ¼­·Î µ¿ÀÏÇÑ ¸í·ÉÀÌ´Ù. ¸í·É Á¾·á ÈÄ cxÀÇ °ªÀº ¹Ýº¹ ½ÇÇàµÈ Ƚ¼ö¸¸Å­ °¨¼ÒÇÑ´Ù. movw $100, %%cx cld repne cmpsb si°¡ °¡¸£Å°´Â 1¹ÙÀÌÆ®¿Í di°¡ °¡¸£Å°´Â 1¹ÙÀÌÆ®¸¦ ºñ±³ÇÏ¿© °°Áö ¾Ê´Ù¸é si¿Í di¸¦ 1¾¿ Áõ°¡½ÃŲ ÈÄ ºñ±³¸¦ ¹Ýº¹ÇÑ´Ù. °°Àº ¹ÙÀÌÆ®¸¦ ¸¸³ª¸é si¿Í di¸¦ 1Áõ°¡½ÃŲ ÈÄ ºñ±³¸¦ Á¾·áÇÑ´Ù. movw $100, %%cx cld repne scasw di°¡ °¡¸£Å°´Â 1¿öµå¿Í axÀÇ °ªÀ» ºñ±³ÇÏ¿© °°Áö ¾Ê´ÂÇÑ si¿Í di¸¦ 2¾¿ Áõ°¡½ÃŲ ÈÄ ºñ±³¸¦ ¹Ýº¹ÇÑ´Ù. axÀÇ °ª°ú °°Àº ¿öµå¸¦ ¸¸³ª¸é si¿Í di ¸¦ 2Áõ°¡ ½ÃŲ ÈÄ ºñ±³¸¦ Á¾·áÇÑ´Ù. -- repe / repz (Repeat while Equal/Zero) ¹®ÀÚ¿­ ó¸® ¸í·ÉÀ» cx ·¹Áö½ºÅÍÀÇ °ª¸¸Å­ ¶Ç´Â zfÀÇ °ªÀÌ 0ÀÏ ¶§±îÁö ¹Ýº¹ ¼öÇà½ÃŲ´Ù. repe¿Í repz´Â ¼­·Î µ¿ÀÏÇÑ ¸í·ÉÀÌ´Ù. ¸í·É Á¾·áÈÄ cxÀÇ °ªÀº ¹Ýº¹ ¼öÇàµÈ Ƚ¼ö¸¸Å­ °¨¼ÒÇÑ´Ù. Áï, À§¿Í ¹Ý´ëµÇ´Â ¸í·ÉÀÌ ´Ù. cld movw $100, %%cx movb $0x20, %%al repe scasb si°¡ °¡¸£Å°´Â 1¹ÙÀÌÆ®°¡ 20h(°ø¹é¹®ÀÚ)ÀÏ °æ¿ì di¸¦ °è¼Ó 1¾¿ Áõ°¡½Ã ÄÑ ³ª°£´Ù. 20h°¡ ¾Æ´Ñ ¹ÙÀÌÆ®¸¦ ¸¸³ª¸é di¸¦ 1Áõ°¡ ½ÃŲ ÈÄ ¸í·É ½ÇÇà À» Á¾·áÇÑ´Ù. repe ¸í·É ½ÇÇàÀü di°¡ °¡¸£Å°´Â °÷¿¡ 5°³ÀÇ °ø¶õÀÌ À̾î Á® ÀÖ´Ù¸é ¸í·É ½ÇÇà ÈÄ di´Â 6Áõ°¡ÇÏ°í cx´Â 6°¨¼ÒÇÑ´Ù. scasb ´ë½Å scasw¸¦ »ç¿ëÇß´Ù¸é 1¿öµå¾¿ axÀÇ °ª°ú ºñ±³ÇÑ´Ù. * À§ÀÇ ±¸¹®¿¡¼­ repne, scasb´Â alÀÇ 0°ú ÀÏÄ¡µÇ´Â ¹®ÀÚ¸¦ edi(dest)°¡ °¡¸£Å°´Â ¹®ÀÚ¿¡¼­ ã¾Æ¼­ ãÀº 0¹®ÀÚ ´ÙÀ½À» edi°¡ °¡¸£Å°°Ô µÈ´Ù. * decl %%edi ¸¦ »ç¿ëÇÏ¿© ÇÑÄ­ ¾ÕÀÇ 0À» °¡¸£Å°µµ·Ï ÇÑ´Ù. ¿©±â¼­ºÎÅÍ strcpy¿Í ºñ½ÁÇÏ´Ù. * lodsb¿Í stosb¸¦ »ç¿ëÇÏ¿© esi(src)¿¡¼­ edi(dest : edi´Â ÀÌÁ¦ ³Î¹®ÀÚ °¡ óÀ½À¸·Î ³ªÅ¸³­ À§Ä¡¸¦ °¡¸£Å²´Ù.)·Î Çѹ®ÀÚ¾¿À» alÀ» °æÀ¯ÇÏ¿© º¹ »ç¸¦ ½ÃÀÛÇÑ´Ù. ¸¸ÀÏ esi(src)¸¦ ÀÐ¾î µéÀÌ´Â µ¿¾È ³Î¹®ÀÚ(0)ÀÌ ³ªÅ¸³­ °æ¿ì(alÀÌ 0Àΰæ¿ì) zf°¡ 1ÀÌ µÇ¹Ç·Î ·çÇÁ¸¦ Á¾·áÇÑ´Ù. ÀÌÁ¦, strncatÀ» »ìÆ캸ÀÚ. 2.4 strncat extern inline char * strncat(char * dest,const char * src,size_t count) { __asm__ __volatile__( "cld\n\t" "repne\n\t" "scasb\n\t" "decl %1\n\t" "movl %4,%3\n" "1:\tdecl %3\n\t" "js 2f\n\t" "lodsb\n\t" "stosb\n\t" "testb %%al,%%al\n\t" "jne 1b\n" "2:\txorl %2,%2\n\t" "stosb" : /* no output */ :"S" (src),"D" (dest),"a" (0),"c" (0xffffffff),"g" (count) :"si","di","ax","cx","memory"); return dest; } * input Çʵå´Â count¸¦ "g"·Î ÀúÀåÇÏ´Â °Í¸¸ »©°í´Â µ¿ÀÏÇÏ´Ù. ¿©±â¼­ "g"´Â ÄÄÆÄÀÏ·¯¿¡°Ô countÀÇ °ªÀ» ¾îµð·Î ÀúÀåÇÒ Áö¸¦ ÀÏÀÓ ÇÏ´Â °ÍÀÌ´Ù. GNU C ÄÄÆÄÀÏ·¯´Â ¶È¶ÈÇϱ⠶§¹®¿¡ ÃÖÀûÈ­¸¦ ÇÒ °ÍÀÌ ´Ù. Âü°í·Î "r"Àº ÄÄÆÄÀÏ·¯¿¡°Ô ¾î´À ·¹Áö½ºÅ͸¦ »ç¿ëÇÒ °ÍÀÎÁö¸¦ ÀÏÀÓÇÏ°Ô µÈ´Ù. commands ±¸¹®¼Ó¿¡¼­ count´Â %4·Î Âü°íµÈ´Ù. * registers Çʵå´Â ÀÌÀü°ú ºñ½ÁÇϸç output Çʵ嵵 ÇÊ¿äÄ¡ ¾Ê´Ù. * cld ´Â ¿ª½Ã df¸¦ 0À¸·Î Ŭ¸®¾îÇÑ´Ù. * repne, scasb ´Â edi(dest)°¡ °¡¸£Å°´Â ¹®ÀÚ°¡ al(0)ÀÇ ¹®ÀÚ¿Í °°Áö ¾Ê ´Â µ¿¾È ¹Ýº¹ÇÏ°í dest Áß¿¡¼­ 0À» ¸¸³­´Ù¸é 0 ´ÙÀ½ À§Ä¡¸¦ edi°¡ °¡¸£ °Ô µÇ°í °Ë»öÀ» Á¾·áÇÑ´Ù. * decl %%edi´Â edi°¡ ¹Ù·Î ÀÌÀüÀÇ 0À» °¡¸£Å°°Ô ÇÑ´Ù. * movl %4, %3 Àº ¹Ýº¹ÇÒ È½¼ö countÀÇ °ªÀ» ecx¿¡ ÀúÀåÇÑ´Ù. * decl %3 Àº decl %%ecx¿Í °°À¸¸ç Ƚ¼ö¸¦ Çϳª °¨¼Ò½ÃŲ´Ù. * js 2f ´Â ecxÀÇ °ªÀÌ À½¼ö¶ó¸é ¶óº§ 2·Î °£´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù. * lodsb, stosb, testb %%al, %%al, jne 1b´Â °¢°¢ esi(src)·Î ºÎÅÍ Çѹ٠ÀÌÆ® ¾¿ÀÇ °ªÀ» Àоî¿Í¼­ alÀ» °æÀ¯ÇÏ¿© edi(dest)·Î º¹»ç¸¦ ÇÏ´Â µ¥, alÀÇ °ªÀÌ 0ÀÌ ¾Æ´Ï¸é ·çÇÁ¸¦ µ¹°í 0ÀÌ¸é ´ÙÀ½ÁÙ·Î ½ÇÇàÀ» ¿Å±ä´Ù. * xorl %2, %2 ´Â xorl %%eax, %%eax ¿Í °°´Ù. xor´Â µÎ ºñÆ®°¡ ¼­·Î ´Ù¸£ ¸é 1ÀÌ µÇ°í °°À¸¸é 0ÀÌ µÇ´Â ¹èŸÀû ³í¸®ÇÕ ¿¬»êÀÚÀÌ´Ù. xor´Â ºñÆ®´ÜÀ§ ·Î ¼öÇàµÇ¸ç xorÀÇ °á°ú´Â µÚÀÇ ÇÇ¿¬»êÀÚ¿¡°Ô µÇµ¹·ÁÁö¸ç ±× °ª¿¡ µû¶ó °¢ Ç÷¡±×ÀÇ °ªÀÌ º¯°æµÈ´Ù. ÀÚ½ÅÀÇ °ªÀ¸·Î xor¸¦ ÇÏ¸é ´ç¿¬È÷ 0°¡ µÈ´Ù. xorl %%eax, %%eax´Â 0À» µÚÀÇ %%eax¿¡ ÀúÀåÀ» ½ÃÅ°°í ±× °ª¿¡ µû¶ó Ç÷¡ ±×¸¦ º¯°æÇÑ´Ù. stosb´Â alÀÇ °ªÀÎ 0À» edi(dest)°¡ °¡¸£Å°´Â °÷¿¡ ÀúÀå ÇÑ´Ù. À̷νá ÇϳªÀÇ ¹®ÀÚ¿­À» ¿Ï¼ºÇÏ´Â °ÍÀÌ´Ù. * ¿ä¾àÇϸé, ¸ÕÀú cld, repne, scasb, decl %%edi ·Î edi(dest)°¡ °¡¸£Å°´Â °÷¿¡¼­ 0À» ã¾Æ¼­ edi°¡ ±× À§Ä¡¸¦ °¡¸£Å°°Ô ÇÑ´Ù. movl %4, %3 °ú decl %3, js 2f ´Â count¸¦ %%ecx¿¡ ÀúÀåÇÏ°í %%ecx¸¦ Çϳª °¨¼Ò½ÃÅ°¸é¼­ ¸¸ÀÏ Ä«¿îÆ®°¡ À½ ¼öÀÏ °æ¿ì ·çÇÁ¸¦ Á¾·áÇÏ¿© edi(dest)°¡ °¡¸£Å°´Â °÷¿¡ ³Î¹®ÀÚ¸¦ Çϳª Àû°í ³¡³½´Ù. lodsb, stosb, testb %%al, %%al, jne 1b´Â esi(src)ºÎÅÍ edi(dest)·Î alÀ» °æÀ¯ÇÏ¿© 0ÀÌ ³ª¿Ã ¶§±îÁö º¹»ç¸¦ ÇÏ°í ¸¶Áö¸·¿¡ stosb·Î alÀÇ 0À» Çѹø ´õ edi(dest)°¡ °¡¸£Å°´Â °÷¿¡ Àû¾îÁØ´Ù. ( ´ÙÀ½ ½Ã°£¿¡ strcmp ºÎÅÍ °è¼ÓµÈ´Ù. ) ddoch Çѵ¿ÈÆ Ãâ·ÂÀÌ ³¡³µ½À´Ï´Ù. [Enter]¸¦ ´©¸£½Ê½Ã¿À. Nownuri ¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡ LINUX ¸®´ª½º Çдç-¸®´ª½º °­Á / ¿¬Àç 1/¸¶Áö¸· ¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡ (LT : ¾î¼À) ¹øÈ£ ¿Ã¸°ID ÀÌ ¸§ ³¯ Â¥ ÀÐÀ½ ÂÊ Á¦ ¸ñ ------------------------------------------------------------------------------ 751 hetta À̱âõ 07/05 317 26 [°­ÁÂ] C¿Í ¾î¼Àºí¸®ÄÚµå (1) 406 ddoch Çѵ¿¿í 02/20 1574 19 [°­ÁÂ06] ÀζóÀÎ ¾î¼Àºí¸®¸¦ ºÐ¼®ÇÏÀÚ! 405 ddoch Çѵ¿¿í 02/20 1424 32 [°­ÁÂ05] ÀζóÀÎ ¾î¼Àºí¸®¸¦ ºÐ¼®ÇÏÀÚ! 404 ddoch Çѵ¿¿í 02/19 1428 30 [°­ÁÂ04] ÀζóÀÎ ¾î¼Àºí¸®¸¦ ºÐ¼®ÇÏÀÚ! 403 ddoch Çѵ¿¿í 02/19 1439 28 [°­ÁÂ03] ÀζóÀÎ ¾î¼Àºí¸®¸¦ ºÐ¼®ÇÏÀÚ! 402 ddoch Çѵ¿¿í 02/19 1901 21 [°­ÁÂ02] ÀζóÀÎ ¾î¼Àºí¸®¸¦ ºÐ¼®ÇÏÀÚ! 400 ddoch Çѵ¿¿í 02/18 2702 31 [°­ÁÂ01] ÀζóÀÎ ¾î¼Àºí¸®¸¦ ºÐ¼®ÇÏÀÚ! ¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡ ¸í·É¾î¾È³»(C) µµ¿ò¸»(H) ÃʱâÈ­¸é(T) À̵¿(GO,P,A,N,B) ù°Ô½Ã¹°(L) Á¾·á(X) ¼±ÅÃ> pr 402 PRINTER/CAPTURE °¡ ÁغñµÇ¾ú½À´Ï±î(Y/n) ? ¡º¸®´ª½º Çдç-¸®´ª½º °­Á / ¿¬Àç (go LINUX)¡» 402¹ø Á¦ ¸ñ:[°­ÁÂ02] ÀζóÀÎ ¾î¼Àºí¸®¸¦ ºÐ¼®ÇÏÀÚ! ¿Ã¸°ÀÌ:ddoch (Çѵ¿¿í ) 97/02/19 02:11 ÀÐÀ½:1901 °ü·ÃÀÚ·á ¾øÀ½ ----------------------------------------------------------------------------- 2.5 strcmp ¹Ù·Î ¾Õ½Ã°£ÀÇ °­Á¹°¿¡¼­ ¼öÁ¤ÇØ¾ß ÇÒ °÷ÀÌ Çϳª ÀÖ´Ù. ^^; strcatÀÇ repe/repz ¼³¸íÁß 340 ¶óÀο¡¼­ ùºÎºÐ "si°¡ °¡¸£Å°´Â ..."À» "di°¡ °¡¸£Å°´Â "À¸·Î ¼öÁ¤ÇÑ´Ù. ¸ÕÀú µé¾î°¡±â Àü¿¡ ¼Ò½º±¸¹® Áß¿¡ ºÙ¾î ÀÖ´Â "\n\t"¿¡ ´ëÇؼ­ Àá½Ã ¤ °í ³Ñ¾î°¡ÀÚ. ÇöÀç commandsÀÇ ¿©·¯ ¶óÀεéÀº ÇϳªÀÇ ¹®ÀÚ¿­¿¡ ºÒ°úÇÏ´Ù. µû¶ó¼­, "cld" "lodsb" "jne" µîÀ¸·Î »ç¿ëÇÒ °æ¿ì ÄÄÆÄÀÏ·¯´Â "cldlodsbjne"ÀÇ ¹®ÀÚ¿­·Î Çؼ®ÇÒ °ÍÀÌ ´Ù. µû¶ó¼­ Á¦´ë·Î Çؼ®Çϵµ·Ï, "cld lodsb jne" ¿Í °°ÀÌ Àû¾îÁְųª ¾Æ·¡¿Í °°ÀÌ °¢ ¶óÀθ¶´Ù "\n\t"¸¦ ±¸ºÐÇÏ¿© Àû¾îÁÖ ´Â °ÍÀÌ ÁÁ´Ù. ÇÊÀÚ°¡ º¸±â¿¡´Â "\n\t"¿Í °°Àº °ÍÀº gcc°¡ "\n"À» ÅëÇØ ¾î¼Àºí¸® ¸í·ÉµéÀ» °¢°¢ ±¸ºÐÇÏ°í ÀÖ´Â °Í°°´Ù. ÀÌÁ¦ strcmpÀÇ ºÐ¼®¿¡ µé¾î°¡º¸ÀÚ. extern inline int strcmp(const char * cs,const char * ct) { register int __res; __asm__ __volatile__( "cld\n" "1:\tlodsb\n\t" "scasb\n\t" "jne 2f\n\t" "testb %%al,%%al\n\t" "jne 1b\n\t" "xorl %%eax,%%eax\n\t" "jmp 3f\n" "2:\tsbbl %%eax,%%eax\n\t" "orb $1,%%eax\n" "3:" :"=a" (__res):"S" (cs),"D" (ct):"si","di"); return __res; } * ¸ÕÀú C¿¡¼­ int·Î __res·Î Çϳª ¼±¾ðÇÑ´Ù. * À̹ø ¼Ò½º¿¡´Â outputÇʵ尡 ÀÖ´Ù. commands¿¡¼­ °è»êµÈ %%eaxÀÇ °á°ú¸¦ __res·Î ³Ñ°ÜÁÖ´Â °ÍÀÌ´Ù. strcmp¿¡¼­ÀÇ ¸®ÅÏ°ªÀ» »ý°¢ÇÏ¸é µÈ´Ù. %%eaxÀÇ °ªÀº C¿¡¼­ ±âº»ÀûÀ¸·Î ¸®ÅÏ°ªÀ¸·Î »ç¿ëµÇ±â ¶§¹®¿¡ C¿¡¼­ ¸®ÅÏÇü ¸¸ ¸í½ÃÇØ ÁÖ¸é ±»ÀÌ __res °°Àº °ÍÀ¸·Î outputÀ» ÇÏÁö ¾Ê´õ¶óµµ ±âº»À¸·Î ¸®ÅϵȴÙ. * input Çʵå´Â ´ÙÀ½°ú °°´Ù. movl cs, esi movl ct, edi ºñ±³ÇÒ µÎ°³ÀÇ ¹®ÀÚ¿­À» °¡¸£Å°´Â Æ÷ÀÎÅÍÀÇ °ªÀ» °¢°¢ source index¿Í dest index¿¡ ÀúÀåÇß´Ù. ¿ø·¡´Â ¸Þ¸ð¸®ÀÇ cs¸¦ 1(cs)¿Í °°Àº Çü½ÄÀ¸·Î ÂüÁ¶ÇØ¾ß ÇÏÁö¸¸ ¼³¸íÀÇ ÆíÀÇ»ó ±×³É cs¿Í °°ÀÌ Àû°Ú´Ù. * registers Çʵ带 º¸¸é si¿Í di¸¦ »ç¿ëÇÑ´Ù°í ÄÄÆÄÀÏ·¯¿¡°Ô ¾Ë·ÁÁÖ°í ÀÖ´Ù. À̹ø ÇÁ·Î±×·¥¿¡¼­ ax´Â °è»ê°á°úÀÇ ¸®ÅÏ ¿ëµµ·Î »ç¿ëµÇ±â ¶§¹®¿¡ ÀÌ ÇÊµå ¿¡ Æ÷ÇÔÀ» ½ÃÄѹö¸®¸é ¾Æ¸¶µµ Á¦´ë·Î µÈ °ªÀ» ¸®ÅÏÇÏÁö ¾ÊÀ» °ÍÀÌ´Ù. ax ´Â C·Î ´Ù½Ã Á¦¾î±ÇÀÌ ³Ñ¾î¿Ã ¶§±îÁö ±× °ªÀÌ º¸°üµÇ¾î¾ß ÇÏ´Â µ¥ ÄÄÆÄÀÏ ·¯¿¡¼­ push, pop À» ÇÏ´Â ·çƾÀ» Áý¾î³Ö¾î ¹ö¸®¸é ¾î¶²ÀÏÀÌ »ý±æ±î? * commands ±¸¹®À» »ìÆ캸ÀÚ. * sbb ( Subtract with Borrow ) À̹ø strcmp¿¡¼­ »õ·Ó°Ô ³ª¿Â ¸í·ÉÀÌ´Ù. ÀÌ°ÍÀÌ ¿Ö ÇÊ¿äÇÑ Áö ¾Ë¾Æº¸ÀÚ. sbb´Â op2(sbbÀÇ µÎ¹ø° ÀÎÀÚ)¿¡¼­ op1+cf(ij¸®Ç÷¡±×)ÀÇ °ªÀ» »«´Ù. °á °ú´Â op2¿¡ µÇµ¹·ÁÁø´Ù. sbb¸í·ÉÀº º¹¼ö¹ÙÀÌÆ®, ¿öµå, ´õºí¿öµåÀÇ »¬¼À ¿¡ »ç¿ëµÈ´Ù. op1°ú op2ÀÇ ¹ÙÀÌÆ®¼ö´Â ÀÏÄ¡ÇØ¾ß Çϸç sub¸í·É°ú µ¿ÀÏÇÏ °Ô Ç÷¡±×µéÀÌ ¼¼Æ®µÈ´Ù. Áï, ÀÛÀº ¼ö¿¡¼­ Å« ¼ö¸¦ »©¸é ÀÚ¸®¼ö¸¦ Çϳª ºô·Á¿Í¾ß Çϴµ¥, À̶§ cf°¡ 1·Î ¼¼Æ®µÈ´Ù. µû¶ó¼­ ´ÙÀ½¿¡ sbbl %%eax, %%eax°ú °°Àº °è»êÀ» Çϸé -1ÀÌ µÈ´Ù. subl %%eax, %%eax´Â 0ÀÌ µÇÁö¸¸ sbblÀ» °°Àº ÇÇ¿¬»êÀÚ¿¡ ÀÛµ¿Çϸé ÀÚ¸®³Ñ±èÀÌ ¹ß»ýÇϴ°¡ÀÇ ¿©ºÎ¿¡ µû¶ó (cfÀÇ °ª¿¡ µû¶ó) 0 À̳ª -1 ÀÌ µÇ´Â °ÍÀÌ´Ù. ÀÌÁ¦ óÀ½ºÎÅÍ »ìÆ캸ÀÚ. * cld ·Î df¸¦ 0À¸·Î ¼³Á¤ÇÏ°í, lodsb·Î esi(cs)°¡ °¡¸£Å°´Â °÷¿¡¼­ 1¹Ù ÀÌÆ®¸¦ al ·Î °¡Á®¿Â´Ù. * scasb ´Â edi°¡ °¡¸£Å°´Â °ª°ú alÀÇ °ªÀ» ºñ±³.°Ë»öÇÑ´Ù. °°Áö ¾Ê´Ù¸é (zf°¡ 0À̶ó¸é) 2f·Î ºÐ±âÇÑ´Ù. ºñ±³½Ã¿¡´Â al ¿¡¼­ edi°¡ °¡¸£Å°´Â °ª À» °¡»óÀûÀ¸·Î »©º¸´Â µ¥, edi°¡ ´õ Å©¼­ ÀÚ¸®³Ñ±èÀÌ ¹ß»ýÇÑ´Ù¸é cf¸¦ 1·Î ¼¼Æ®ÇÑ´Ù. µû¶ó¼­ 2f¿¡¼­ÀÇ sbbl %%eax, %%eax´Â edi°¡ °¡¸£Å°´Â °ªÀÌ ´õ Å©´Ù¸é %%eax¿¡´Â -1ÀÌ ÀúÀåµÉ °ÍÀÌ°í ±×·¸Áö ¾Ê´Ù¸é 0ÀÌ ÀúÀå µÉ °ÍÀÌ´Ù. orb $1, %%eax ÇöÀç %%eax´Â 0 (al(esi)°¡ °¡¸£Å°´Â °ªÀÌ ´õ Ŭ °æ¿ì)À̰ųª -1 (edi°¡ °¡¸£Å°´Â °ªÀÌ ´õ Ŭ °æ¿ì)Àε¥ ¿©±â¿¡ 1À» or¿¬»êÀ» Çغ¸ÀÚ. -1ÀÏ °æ ¿ì¿¡´Â -1ÀÌ µÇ°í, 0ÀÏ °æ¿ì¿¡´Â 1ÀÌ µÈ´Ù. Çѹø ¿¬½ÀÀå¿¡ ÀûÀ¸¸é¼­ °Ë »çÇغ¸ÀÚ. À̷μ­ strcmp¿¡¼­ÀÇ cs¿Í ctÀÇ ºñ±³°¡ ÀÌ·ç¾îÁ® Å©±â°¡ cs°¡ Å©¸é 1ÀÌ , ct°¡ Å©¸é -1ÀÌ µ¹·ÁÁüÀ» ¾Ë ¼ö ÀÖ´Ù. * ¹®ÀÚ¿­ÀÌ ³¡±îÁö °°Àº °æ¿ì¸¦ º¸ÀÚ¸é, lodsb, scasb, testb, jne 1b¸¦ °ÅÃÄ ·çÇÁ¸¦ ¹Ýº¹ÇÑ´Ù. ±×·¯´Ù ¸¶Áö¸· ³Î¹®ÀÚ¸¦ ¸¸³ª¸é testb %%al, %%al·Î alÀÌ 0Àΰ¡¸¦ °Ë»çÇؼ­ 0À̹ǷΠxorl %%eax, %%eaxÀÇ °á°ú°ªÀº 0ÀÌ µÇ¾î %%eax¿¡ ÀúÀåÀÌ µÇ°í, 3f·Î ºÐ±âÇؼ­ Á¾·áÇÏ°Ô µÈ´Ù. * eaxÀÇ -1, 0, 1ÀÇ °è»ê°á°ú°ªÀº output Çʵ忡¼­ "=a" (__res) Ç׿¡ ÀÇÇØ __res¿¡ µÇµ¹·ÁÁø´Ù. * ¿ä¾àÇϸé, lodsb¿Í scasb·Î csÀÌ °¡¸£Å°´Â °ªÀ» ¿Å±ä alÀÇ °ª°ú ediÀÇ °ªÀ» ºñ±³ÇÏ¿© ³Î¹®ÀÚ°¡ ³ª¿Ã¶§ ±îÁö °°À¸¸é xor¿¬»êÀ¸·Î 0À», alÀÇ °ªÀÌ ´õÅ©¸é or¿¬»êÀ¸·Î 1À», edi°¡ °¡¸£Å°´Â °ªÀÌ ´õ Å©¸é -1À» µ¹·Á ÁÜÀ» ¾Ë ¼ö ÀÖ´Ù. 2.6 strncmp extern inline int strncmp(const char * cs,const char * ct,size_t count) { register int __res; __asm__ __volatile__( "cld\n" "1:\tdecl %3\n\t" "js 2f\n\t" "lodsb\n\t" "scasb\n\t" "jne 3f\n\t" "testb %%al,%%al\n\t" "jne 1b\n" "2:\txorl %%eax,%%eax\n\t" "jmp 4f\n" "3:\tsbbl %%eax,%%eax\n\t" "orb $1,%%al\n" "4:" :"=a" (__res):"S" (cs),"D" (ct),"c" (count):"si","di","cx"); return __res; } * output Çʵå´Â strcmp ¶§¿Í °°ÀÌ eaxÀÇ °è»ê°á°ú °ªÀ» __res·Î µÇµ¹¸®°í, input Çʵ忡¼­´Â Æ÷ÀÎÅÍ csÀÇ °ªÀº esi¿¡, Æ÷ÀÎÅÍ ctÀÇ °ªÀº edi¿¡, countÀÇ °ªÀº ecx¿¡ ¹Ì¸® ÀúÀåÀ» ÇÑ´Ù. registers Çʵ忡¼­µµ ¾Õ°ú ¸¶Âù °¡Áö·Î ¸®ÅÏ°ªÀÌ µé¾î°¥ eax¸¦ Á¦¿ÜÇÑ º¯°æµÇ´Â ·¹Áö½ºÅ͵éÀÌ ÀûÇôÀÖ´Ù. * ¾Õ¼­µµ À̾߱â ÇßÁö¸¸ output, input ÀÌ commands¿¡¼­ %0, %1 µîÀ¸·Î Âü Á¶µÇ´Â ÂüÁ¶µÇ´Â ¼ø¼­´Â output, input ¼øÀÌ´Ù. * cld·Î df¸¦ 0À¸·Î Ŭ¸®¾îÇÑ´Ù. * decl %3Àº ÂüÁ¶¼ø¼­¿¡ µû¶ó decl %%ecx¿Í ¶È°°À¸¸ç °Ë»çÇÒ Ä«¿îÆ®¸¦ ÇÏ ³ª °¨¼Ò½ÃŲ´Ù. ¸¸ÀÏ À½¼öÀ̸é (sf-ºÎÈ£Ç÷¡±×-°¡ 1À̸é) js 2f±¸¹®¿¡ µû¶ó 2f·Î ºÐ±âÇÑ´Ù. ¶óº§ 2f¿¡¼­´Â eax¸¦ xor¿¬»êÀ¸·Î 0À¸·Î ¸¸µé°í 4f ·Î ºÐ±âÇÏ¿© Á¾·áÇÑ´Ù. * decl¿¡ ÀÇÇØ À½¼ö°¡ ¾Æ´Ò °æ¿ì¿¡´Â esi(cs)°¡ °¡¸£Å°´Â À§Ä¡·ÎºÎÅÍ ÇѹÙÀÌ Æ®¸¦ al·Î ¿Å°Ü (lodsb) edi(ct)°¡ °¡¸£Å°´Â À§Ä¡ÀÇ °ª°ú °¡»óÀûÀ¸·Î »© º½À¸·Î½á °°Àº°¡ °Ë»ç¸¦ ÇÑ´Ù. °°Áö ¾Ê´Ù¸é 3f·Î ºÐ±âÇÏ¿© sbbl±¸¹®°ú orb±¸¹®¿¡ ÀÇÇØ alÀÇ °ªÀÌ ´õ Å©¸é 1ÀÌ edi(ct)°¡ °¡¸£Å°´Â À§Ä¡ÀÇ °ªÀÌ ´õ Å©¸é -1ÀÌ eax¿¡ ÀúÀåµÇ¾î µÇµ¹·ÁÁø´Ù. strcmp¿¡¼­ÀÇ orb $1, %%eax º¸´Ù´Â orb %1, %%alÀÇ ±¸¹®ÀÌ Á¤È®ÇØ º¸ÀδÙ. * À§ÀÇ scasb ·Î alÀÇ °ª°ú edi(ct)ÀÇ °ªÀÌ °°´Ù¸é testb±¸¹®¿¡ ÀÇÇØ alÀÇ °ªÀÌ 0ÀÎÁö¸¦ °Ë»çÇÏ¿© 0ÀÌ ¾Æ´Ï¶ó¸é 1b·Î °¡¼­ ·çÇÁ¸¦ µ¹°í 0À̶ó¸é 2: ¿¡¼­ xor·Î eax°¡ 0À¸·Î µÇ°í 4f·Î ºÐ±âÇÏ¿© Á¾·áµÈ´Ù. * eaxÀÇ °ªÀº "=a" (__res) ±¸¹®¿¡ ÀÇÇØ __res¿¡ ÀúÀåµÇ¾î C·çƾÀ¸·Î µ¹·Á Áø´Ù. * ¿ä¾àÇϸé, decl·Î count¸¦ ¸ÕÀú 1À» »«´ÙÀ½¿¡ lodsb, scasb·Î cs¿Í ct ÀÇ ¹®ÀÚµéÀ» ºñ±³¸¦ ÇÏ¿© °°Áö ¾Ê´Ù¸é 3f¿¡¼­ -1, 1À» ±× Å©±â¿¡ µû¶ó ¹ÝȯÇÏ°í, °°°í ³Î¹®ÀÚ¸¦ ¸¸³ª¸é xor·Î eax°¡ 0ÀÌ µÇ¾î ¹ÝȯµÇ°í, °°°í ³Î¹®ÀÚ°¡ ¾Æ´Ï¶ó¸é ·çÇÁ¸¦ µ¹´Ù°¡ count°¡ À½¼ö°¡ µÇ¸é ³¡À» ³½´Ù. 2.7 strchr C¿¡¼­ strchrÀÇ ¿øÇüÀº ´ÙÀ½°ú °°´Ù. char *strchr(const char *s, int c); ¹®ÀÚ¿­ s¿¡¼­ ¹®ÀÚ c°¡ óÀ½À¸·Î ³ªÅ¸³ª´Â °÷ÀÇ À§Ä¡¸¦ µ¹·ÁÁÖ´Â °ÍÀÌ´Ù. ¾î¼Àºí¸® ·çƾÀ» »ìÆ캸ÀÚ. extern inline char * strchr(const char * s, int c) { register char * __res; __asm__ __volatile__( "cld\n\t" "movb %%al,%%ah\n" "1:\tlodsb\n\t" "cmpb %%ah,%%al\n\t" "je 2f\n\t" "testb %%al,%%al\n\t" "jne 1b\n\t" "movl $1,%1\n" "2:\tmovl %1,%0\n\t" "decl %0" :"=a" (__res):"S" (s),"0" (c):"si"); return __res; } * output Àº ÀÌÀü°ú °°´Ù. * input ¿¡¼­´Â esi¿¡ sÀÇ °ªÀ» ÀúÀåÇÏ°í, %0¿¡ c¸¦ ÀúÀåÇÑ´Ù. ¿©±â¼­ "0"Àº commands¿¡¼­ %0À¸·Î ÂüÁ¶ÇÒ ¼ö ÀÖ´Â output ÇʵåÀÇ eaxÀÌ´Ù. Áï, eax(%0)Àº ÀԷ°ªÀ¸·Î´Â c°¡ ÀúÀåµÇ°í Ãâ·Â°ªÀ¸·Î´Â ÇØ´ç¹®ÀÚÀÇ Ã£Àº À§Ä¡(Æ÷ÀÎÅÍ)°¡ ÀúÀåµÈ´Ù. * ¸¶Âù°¡Áö·Î registers Çʵ忡¼­´Â si¸¦ ¿ì¸®°¡ »ç¿ëÇÒ °ÍÀÓÀ» ¾Ë¸°´Ù. * movb %%al, %%ah ´Â strchr¿¡¼­ ¿ì¸®°¡ ã´Â ¹®ÀÚÀÎ c°¡ al¿¡ ÀúÀåµÇ ¾î ÀÖÀ¸¹Ç·Î ah·Î ¹é¾÷À» ÇѺΠÇصдÙ. * lodsb·Î esi(s)°¡ °¡¸£Å°´Â À§Ä¡·Î ºÎÅÍ ÇѹÙÀÌÆ®¸¦ Àоî¿Í¼­ al¿¡ ÀúÀåÇÑ´Ù. * cmpb %%ah, %%al ·Î ã´Â ¹®ÀÚ¿Í esi(s)°¡ °¡¸£Å°´Â °÷À¸·Î ºÎÅÍ °¡ Á®¿Â ¹®ÀÚ°¡ ÀÏÄ¡ÇÏ´Â Áö °Ë»çÇÑ´Ù. °°´Ù¸é je 2f¿¡ ÀÇÇØ movl %1, %0Àº movl %%esi, %%eax¿Í °°ÀÌ ½ÇÇàµÇ¾î ãÀº ´ÙÀ½ÀÇ À§Ä¡¸¦ eax ¿¡ ÀúÀåÇÑ´Ù. lodsb´Â esi°¡ °¡¸£Å°´Â °÷¿¡¼­ ÇѹÙÀÌÆ®¸¦ Àоî¿À°í ³­ ´ÙÀ½¿¡´Â esi¸¦ Çϳª Áõ°¡½ÃÅ°´Â °ÍÀ» »ó±âÇÏÀÚ. µû¶ó¼­ decl %%eax·Î ÀÏÄ¡ÇÏ´Â ¹®ÀÚ°¡ ÀÖ´Â À§Ä¡·Î ÇÑÄ­ °¨¼Ò½ÃÄÑ¾ß ÇÑ´Ù. * cmpb¿¡¼­ ah¿Í alÀÌ °°Áö ¾Ê´Ù¸é testb ¿¡ ÀÇÇØ alÀÌ 0ÀÎÁö °Ë»çµÇ °í 0ÀÌ ¾Æ´Ï¸é 1b·Î ºÐ±âÇÏ¿© ´Ù½Ã ºñ±³·çÇÁ¸¦ ¹Ýº¹ÇÑ´Ù. ±×·¯´Ù ¸ø ã°í ³Î¹®ÀÚ¸¦ ¸¸³ª¸é jne¸¦ Áö³ª¼­ movl $1, %%esi·Î esi¿¡ 1ÀÌ ÀúÀåµÇ°í movl %1, %0 ¿¡ ÀÇÇØ esiÀÇ °ªÀÌ eax¿¡ ÀúÀåµÇ°í decl %0 À¸·Î eax°¡ Çϳª °¨¼ÒµÇ¾î 0ÀÌ µÇ°í, ÀÌ°ÍÀº ±× À¯¸íÇÑ NULLÀÌ µÈ´Ù. * °á°úÀûÀ¸·Î declÀº ´Ù¸ñÀû ¿ëµµ·Î ¾²ÀÌ´Â ¼ÀÀÌ´Ù. 2.8 strrchr C¿¡¼­ strrchrÀÇ ¿øÇüÀº ´ÙÀ½°ú °°´Ù. char *strrchr(const char *s, int c); ¹®ÀÚ¿­ s¿¡¼­ c¹®ÀÚ°¡ ¸¶Áö¸·À¸·Î ³ª¿À´Â À§Ä¡¸¦ µ¹·ÁÁÖ´Â °ÍÀÌ´Ù. ¾î¼Àºí¸® ·çƾÀ» »ìÆ캸ÀÚ. extern inline char * strrchr(const char * s, int c) { register char * __res; __asm__ __volatile__( "cld\n\t" "movb %%al,%%ah\n" "1:\tlodsb\n\t" "cmpb %%ah,%%al\n\t" "jne 2f\n\t" "leal -1(%%esi),%0\n" "2:\ttestb %%al,%%al\n\t" "jne 1b" :"=d" (__res):"0" (0),"S" (s),"a" (c):"ax","si"); return __res; } * output Çʵ带 ¸ÕÀú º¸¸é "=d" (__res)¿¡ ÀÇÇØ edx °è»ê °á°ú°ªÀÌ __res·Î µ¹·ÁÁüÀ» ¾Ë ¼ö ÀÖ´Ù. * input Çʵ忡¼­´Â output ÇʵåÀÇ Ã¹¹ø° ·¹Áö½ºÅÍÀÎ edx¸¦ "0"À¸·Î ÂüÁ¶ÇÏ°í ÀÖÀ¸¸ç ±× edx¿¡ 0À» Áý¾î³Ö°í ÀÖ´Ù. esi¿¡ s¸¦, eax¿¡ c ¸¦ ´ëÀÔÇÏ°í ÀÖ´Ù. ¸¶Âù°¡Áö·Î °ªÀ» µÇµ¹¸®´Â output ·¹Áö½ºÅ͸¦ Á¦¿ÜÇÑ º¯°æµÇ´Â ·¹Áö½ºÅ͸¦ ¸¶Áö¸· Çʵå registers¿¡ ¼ö·ÏÇÏ°í ÀÖ´Ù. * commands Çʵ忡¼­´Â ¸ÕÀú al¿¡ ÀúÀåµÈ ã´Â ¹®ÀÚ¸¦ ah·Î º¹»ç¸¦ ÇÑ ºÎ Çصΰí ÀÖ´Ù. (movb %%al, %%ah) * ±× ´ÙÀ½ lodsb·Î esi(s)°¡ °¡¸£Å°´Â °÷ÀÇ °ªÀ» Çϳª °¡Á®¿Í¼­ al¿¡ ¼ö·ÏÇÑ´Ù. * cmpb %%ah, %%al·Î Àоî¿Â ¹®ÀÚ¿Í Ã£´Â ¹®ÀÚ°¡ °°Àº Áö ºñ±³ÇÑ´Ù. * °°Áö ¾Ê´Ù¸é 2f·Î ºÐ±âÇÏ¿© Àоî¿Â ¹®ÀÚ(al)°¡ 0ÀÌ ¾Æ´Ï¶ó¸é °è¼Ó °Ë»öÇØ¾ß ÇϹǷΠ1b·Î ºÐ±âÇÏ¿© ·çÇÁ¸¦ µ·´Ù. cmpb¿¡ ÀÇÇØ °°Áö ¾Ê ¾Æ¼­ 2f·Î ºÐ±â Çߴµ¥ testb¿¡ ÀÇÇØ alÀÌ 0À̸é edxÀÇ °ªÀº º¯°æ µÇÁö ¾Ê°í 0ÀÌ µÇ¾î °á°úÀûÀ¸·Î NULL·Î __res¿¡ µÇµ¹·ÁÁø´Ù. * ¸¸ÀÏ cmpb¿¡ ÀÇÇØ Ã£´Â ¹®ÀÚ¿Í Àоî¿Â ¹®ÀÚ°¡ °°´Ù¸é leal -1(%%esi) ,%0°¡ ¼öÇàµÈ´Ù. -1(%%esi)´Â esi-1°ú °°´Ù. lodsb´Â Çѹø Àоî¿À °í ³­µÚ¿¡´Â esi¸¦ Çϳª Áõ°¡½ÃÅ°¹Ç·Î °°´Ù°í ÆÇ´ÜµÉ °æ¿ì¿¡´Â esi ´Â ¹ú½á ´ÙÀ½À§Ä¡¸¦ °¡¸£Å°°í ÀÖÀ¸¹Ç·Î leal -1(%%esi), %0Àº leal -1(%%esi), %edx°¡ µÇ¾î °°Àº ¹®ÀÚ°¡ ÀÖ´Â À§Ä¡¸¦ edx¿¡ ¼ö·Ï ÇÑ´Ù. lea´Â mov¿Í ÀǹÌÀûÀ¸·Î´Â ºñ½ÁÇÏ´Ù. ±×·± ´ÙÀ½ testb¿¡ ÀÇ ÇØ alÀÌ 0ÀÎÁö °Ë»çÇÏ°í 0ÀÌ¸é ¹®ÀÚ¿­ÀÇ ³¡À̹ǷΠ¸¶Áö¸·À¸·Î Àú ÀåµÈ edxÀÇ °ªÀ» __res¿¡ µÇµ¹¸°´Ù. ¸¸ÀÏ alÀÌ 0ÀÌ ¾Æ´Ò °æ¿ì´Â ¶ó º§ 1b·Î ºÐ±âÇÏ¿© ºÒ·¯¿Í¼­ ºñ±³Çϱ⸦ ¹Ýº¹ÇÏ°í °°À» °æ¿ì´Â leal ·Î ÀÎÇØ ÀÏÄ¡ÇÑ À§Ä¡°¡ edx°¡ ¾÷µ¥ÀÌÆ® µÈ´Ù. ÀÌ·¸°Ô ÇÏ¿© ÀÏÄ¡ÇÑ ¹®ÀÚÀÇ ÃÖÁ¾ Æ÷ÀÎÅÍ°¡ edx¿¡ ÀúÀåµÇ´Â °ÍÀÌ´Ù. * ¾ÆÁÖ °£°áÇÏ°Ô Àß Â¥¿©Á® À־ Á¦ ¿ªÇÒÀ» ´ÙÇÏ°í ÀÖÀ½À» ¾Ë ¼ö ÀÖ ´Ù. ( ´ÙÀ½ ½Ã°£¿¡ °è¼ÓµÈ´Ù. ) Ãâ·ÂÀÌ ³¡³µ½À´Ï´Ù. [Enter]¸¦ ´©¸£½Ê½Ã¿À. Nownuri ¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡ LINUX ¸®´ª½º Çдç-¸®´ª½º °­Á / ¿¬Àç 1/¸¶Áö¸· ¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡ (LT : ¾î¼À) ¹øÈ£ ¿Ã¸°ID ÀÌ ¸§ ³¯ Â¥ ÀÐÀ½ ÂÊ Á¦ ¸ñ ------------------------------------------------------------------------------ 751 hetta À̱âõ 07/05 317 26 [°­ÁÂ] C¿Í ¾î¼Àºí¸®ÄÚµå (1) 406 ddoch Çѵ¿¿í 02/20 1574 19 [°­ÁÂ06] ÀζóÀÎ ¾î¼Àºí¸®¸¦ ºÐ¼®ÇÏÀÚ! 405 ddoch Çѵ¿¿í 02/20 1424 32 [°­ÁÂ05] ÀζóÀÎ ¾î¼Àºí¸®¸¦ ºÐ¼®ÇÏÀÚ! 404 ddoch Çѵ¿¿í 02/19 1428 30 [°­ÁÂ04] ÀζóÀÎ ¾î¼Àºí¸®¸¦ ºÐ¼®ÇÏÀÚ! 403 ddoch Çѵ¿¿í 02/19 1439 28 [°­ÁÂ03] ÀζóÀÎ ¾î¼Àºí¸®¸¦ ºÐ¼®ÇÏÀÚ! 402 ddoch Çѵ¿¿í 02/19 1902 21 [°­ÁÂ02] ÀζóÀÎ ¾î¼Àºí¸®¸¦ ºÐ¼®ÇÏÀÚ! 400 ddoch Çѵ¿¿í 02/18 2702 31 [°­ÁÂ01] ÀζóÀÎ ¾î¼Àºí¸®¸¦ ºÐ¼®ÇÏÀÚ! ¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡ ¸í·É¾î¾È³»(C) µµ¿ò¸»(H) ÃʱâÈ­¸é(T) À̵¿(GO,P,A,N,B) ù°Ô½Ã¹°(L) Á¾·á(X) ¼±ÅÃ> pr 402 PRINTER/CAPTURE °¡ ÁغñµÇ¾ú½À´Ï±î(Y/n) ? n Nownuri ¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡ LINUX ¸®´ª½º Çдç-¸®´ª½º °­Á / ¿¬Àç 1/¸¶Áö¸· ¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡ (LT : ¾î¼À) ¹øÈ£ ¿Ã¸°ID ÀÌ ¸§ ³¯ Â¥ ÀÐÀ½ ÂÊ Á¦ ¸ñ ------------------------------------------------------------------------------ 751 hetta À̱âõ 07/05 317 26 [°­ÁÂ] C¿Í ¾î¼Àºí¸®ÄÚµå (1) 406 ddoch Çѵ¿¿í 02/20 1574 19 [°­ÁÂ06] ÀζóÀÎ ¾î¼Àºí¸®¸¦ ºÐ¼®ÇÏÀÚ! 405 ddoch Çѵ¿¿í 02/20 1424 32 [°­ÁÂ05] ÀζóÀÎ ¾î¼Àºí¸®¸¦ ºÐ¼®ÇÏÀÚ! 404 ddoch Çѵ¿¿í 02/19 1428 30 [°­ÁÂ04] ÀζóÀÎ ¾î¼Àºí¸®¸¦ ºÐ¼®ÇÏÀÚ! 403 ddoch Çѵ¿¿í 02/19 1439 28 [°­ÁÂ03] ÀζóÀÎ ¾î¼Àºí¸®¸¦ ºÐ¼®ÇÏÀÚ! 402 ddoch Çѵ¿¿í 02/19 1902 21 [°­ÁÂ02] ÀζóÀÎ ¾î¼Àºí¸®¸¦ ºÐ¼®ÇÏÀÚ! 400 ddoch Çѵ¿¿í 02/18 2702 31 [°­ÁÂ01] ÀζóÀÎ ¾î¼Àºí¸®¸¦ ºÐ¼®ÇÏÀÚ! ¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡ ¸í·É¾î¾È³»(C) µµ¿ò¸»(H) ÃʱâÈ­¸é(T) À̵¿(GO,P,A,N,B) ù°Ô½Ã¹°(L) Á¾·á(X) ¼±ÅÃ> pr 403 PRINTER/CAPTURE °¡ ÁغñµÇ¾ú½À´Ï±î(Y/n) ? ¡º¸®´ª½º Çдç-¸®´ª½º °­Á / ¿¬Àç (go LINUX)¡» 403¹ø Á¦ ¸ñ:[°­ÁÂ03] ÀζóÀÎ ¾î¼Àºí¸®¸¦ ºÐ¼®ÇÏÀÚ! ¿Ã¸°ÀÌ:ddoch (Çѵ¿¿í ) 97/02/19 15:39 ÀÐÀ½:1439 °ü·ÃÀÚ·á ¾øÀ½ ----------------------------------------------------------------------------- 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 Çѵ¿ÈÆ Ãâ·ÂÀÌ ³¡³µ½À´Ï´Ù. [Enter]¸¦ ´©¸£½Ê½Ã¿À. Nownuri ¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡ LINUX ¸®´ª½º Çдç-¸®´ª½º °­Á / ¿¬Àç 1/¸¶Áö¸· ¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡ (LT : ¾î¼À) ¹øÈ£ ¿Ã¸°ID ÀÌ ¸§ ³¯ Â¥ ÀÐÀ½ ÂÊ Á¦ ¸ñ ------------------------------------------------------------------------------ 751 hetta À̱âõ 07/05 317 26 [°­ÁÂ] C¿Í ¾î¼Àºí¸®ÄÚµå (1) 406 ddoch Çѵ¿¿í 02/20 1574 19 [°­ÁÂ06] ÀζóÀÎ ¾î¼Àºí¸®¸¦ ºÐ¼®ÇÏÀÚ! 405 ddoch Çѵ¿¿í 02/20 1424 32 [°­ÁÂ05] ÀζóÀÎ ¾î¼Àºí¸®¸¦ ºÐ¼®ÇÏÀÚ! 404 ddoch Çѵ¿¿í 02/19 1428 30 [°­ÁÂ04] ÀζóÀÎ ¾î¼Àºí¸®¸¦ ºÐ¼®ÇÏÀÚ! 403 ddoch Çѵ¿¿í 02/19 1440 28 [°­ÁÂ03] ÀζóÀÎ ¾î¼Àºí¸®¸¦ ºÐ¼®ÇÏÀÚ! 402 ddoch Çѵ¿¿í 02/19 1902 21 [°­ÁÂ02] ÀζóÀÎ ¾î¼Àºí¸®¸¦ ºÐ¼®ÇÏÀÚ! 400 ddoch Çѵ¿¿í 02/18 2702 31 [°­ÁÂ01] ÀζóÀÎ ¾î¼Àºí¸®¸¦ ºÐ¼®ÇÏÀÚ! ¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡ ¸í·É¾î¾È³»(C) µµ¿ò¸»(H) ÃʱâÈ­¸é(T) À̵¿(GO,P,A,N,B) ù°Ô½Ã¹°(L) Á¾·á(X) ¼±ÅÃ> pr 404 PRINTER/CAPTURE °¡ ÁغñµÇ¾ú½À´Ï±î(Y/n) ? ¡º¸®´ª½º Çдç-¸®´ª½º °­Á / ¿¬Àç (go LINUX)¡» 404¹ø Á¦ ¸ñ:[°­ÁÂ04] ÀζóÀÎ ¾î¼Àºí¸®¸¦ ºÐ¼®ÇÏÀÚ! ¿Ã¸°ÀÌ:ddoch (Çѵ¿¿í ) 97/02/19 22:38 ÀÐÀ½:1428 °ü·ÃÀÚ·á ¾øÀ½ ----------------------------------------------------------------------------- 2.14 strtok ¹Ì¸® ¼ûÀ» Å©°Ô Çѹø ½¬ÀÚ. ±×·¸´Ù°í Çؼ­ ÁÖ´ªµé ÇÊ¿ä´Â ¾ø´Ù. ºÐ·® ¸¸ ¸¹À» »ÓÀÌÁö ÀÌÀü¿¡¼­ º¸¾Æ¿Ô´ø ·çƾµéÀÇ Áö°Ü¿î ¹Ýº¹ÀÏ »ÓÀÌ´Ù. Â÷ºÐÈ÷ Å丷Å丷 ³»¾îº¸ÀÚ. ¸®´ª¼­¿¡°Ô´Â ºÒ°¡´ÉÀÌ ¾øÁö ¾ÊÀº°¡? ÀÌ¿Í °°Àº CÀÇ ¼Ò½º°¡ "/usr/src/linux/lib/string.c"¿¡ ÀÖÀ¸´Ï º¹Àâ ÇÑ °ÍÀº ºñ±³¸¦ ÇØ°¡¸é¼­ º¸´Â °Íµµ Àç¹ÌÀÖÀ» °ÍÀÌ´Ù. ¹°·Ð ÀÌ µÑ ´Ù ¸®´©½º Åä¹ßÁî¿¡ ÀÇÇØ ¾²¿©Á³´Ù. ¸ÕÀú C¿¡¼­ÀÇ strtokÀÇ Çൿ¾ç½ÄºÎÅÍ ÆľÇÇÏÀÚ. char *strtok(char *s, const char *ct); ÇѸ¶µð·Î strtokÀº ´Ù¸¥ ÇÔ¼öµé¿¡ ºñÇغ¼ ¶§ ºñÁ¤»óÀûÀÎ °ÍÀÓÀº Ʋ¸² ¾ø´Ù. À¯¿ëÇϱâ´Â ÇÏÁö¸¸.. ^^; Àá½Ã ¾Æ·¡ÀÇ ¼Ò½º¸¦ Å×½ºÆ®Çغ¸ÀÚ. Çൿ¾ç½ÄÀÌ ÀÌÇØ°¡ µÉ °ÍÀÌ´Ù. --------------------------------------------------------------------- #include #include void main() { char str[] = "ab:cd::ef"; char *del = ":"; char *token; token = strtok(str, del); while (token != NULL) { printf("%s\n", token); token = strtok(NULL, del); } printf("again = %s\n", str); } --------------------------------------------------------------------- °á°ú´Â ´ÙÀ½°ú °°´Ù. ab cd ef Áï, óÀ½¿¡ strtok(str, del)°ú °°ÀÌ È£ÃâÇϸé str¿¡¼­ del¿¡ ÇØ´ç ÇÏ´Â ¹®ÀÚ°¡ ³ª¿Ã°æ¿ì '\0'À¸·Î ä¿ì°í óÀ½À¸·Î del¿¡ ÇØ´çµÇÁö ¾Ê´Â ¹®ÀÚ¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ¸®ÅÏÇÑ´Ù. µû¶ó¼­ str : "ab\0cd::ef\0" index: 012 3456789 ¿Í °°ÀÌ µÇ¾î ÀÖÀ» °ÍÀÌ´Ù. index 0ÀÇ Æ÷ÀÎÅ͸¦ µ¹·ÁÁÖ°í ¾Æ¸¶µµ index 3ÀÇ Æ÷ÀÎÅÍ´Â ___strtok Àü¿ªº¯¼ö¿¡ ÀúÀåÇÒ °ÍÀÌ´Ù. ±× ´Ù À½¿¡ token = strtok(NULL, del); ¿Í °°ÀÌ È£ÃâÇÏ¿© str´ë½Å¿¡ NULLÀÌ ÁÖ¾îÁø´Ù¸é ÀÌÀü¿¡ ÀúÀåµÈ ___strtok º¯¼ö¸¦ »ç¿ëÇÒ °ÍÀÌ´Ù. À̹ø¿¡´Â index 5¸¦ '\0'·Î ä¿ì °í index 3ÀÇ Æ÷ÀÎÅ͸¦ ¹ÝȯÇÒ °ÍÀÌ°í index 6¿¡ ´ëÇÑ Æ÷ÀÎÅÍ´Â ´Ù½Ã ___strtok¿¡ ÀúÀåµÉ °ÍÀÌ´Ù. strtok(NULL, del)À» Çѹø ´õ È£Ãâ ÇÑ´Ù ¸é index 6¿¡¼­ del¿¡ ÇØ´çÇÏ´Â ¹®ÀÚ´Â °Ç³Ê¶Ù°í index 7¿¡ ´ëÇÑ Æ÷ ÀÎÅ͸¦ µ¹·ÁÁÙ °ÍÀÌ°í, ´õÀÌ»ó del ¹®ÀÚ°¡ º¸ÀÌÁö ¾Ê°í '\0'À» ¸¸³ª ¹Ç·Î ___strtok¿¡´Â NULLÀ» ÀúÀåÇÒ °ÍÀÌ´Ù. Çѹø ´õ À§¿Í °°ÀÌ È£ÃâÇÑ´Ù¸é ÀÌÁ¦´Â ´õ ÀÌ»ó ºÐ¸®ÇÒ ÅäÅ«ÀÌ ¾øÀ¸¹Ç·Î ___strtokÀÇ NULLÀ» ¸®ÅÏ°ªÀ¸·Î µ¹·Á ÁÙ °ÍÀÌ´Ù. ¸¸ÀÏ strtok(str2, del)°ú °°ÀÌ ´Ù¸¥ ¹®ÀÚ¿­¿¡ ´ëÇÑ ÀÛ¾÷À» ÇÑ´Ù¸é ___strtok º¯¼öÀÇ °ªÀÌ ´õÀÌ»ó ÀÌÀüÀÇ ¹®ÀÚ¿­ Æ÷ÀÎÅÍ¿¡ ´ëÇÑ Á¤º¸ ¸¦ °¡ÁöÁö ¾Ê°í »õ·Ó°Ô óÀ½ºÎÅÍ ½ÃÀÛÇÒ °ÍÀÌ´Ù. "/usr/src/linux/lib/string.c"ÀÇ strtokÀÇ C ¼Ò½º¸¦ Àá±ñ º¸ÀÚ. Á¦ÀÏ ¾ÕÂÊ¿¡ ___strtok ÀÌ Àü¿ªº¯¼ö·Î ¼±¾ðµÇ¾î ÀÖ´Ù. --------------------------------------------------------------------- /* strtok -- /usr/src/linux/lib/string.c ¿¡¼­.. */ char * ___strtok = NULL; char *strtok(char *s, const char *ct) { char *sbegin, *send; /* sÀÇ °ªÀÌ NULL(0)À̸é ÀÌÀü¿¡ ÀúÀåµÈ ___strtok ÀÇ °ªÀÌ sbegin¿¡ ÀúÀåµÇ°í ¾Æ´Ï¸é sÀÇ °ªÀÌ sbeginÀ¸·Î ÀúÀåµÇ¾î »õ·Î¿î str(s)¿¡ ´ëÇؼ­ ÀÛ¾÷À» ÇÑ´Ù. */ sbegin = s ? s : ___strtok; /* sbeginÀÌ NULL(0)À̶ó´Â °ÍÀº ___strtokÀÌ NULL(0)À̶ó´Â °ÍÀ» ÀǹÌÇÏ¸ç ´õÀÌ»ó ºÐ¸®ÇÒ ÅäÅ«ÀÌ ¾ø´Ù´Â °ÍÀ» ÀÇ¹Ì ÇÑ´Ù. NULLÀ» ¸®ÅÏÇÑ´Ù. */ if (!sbegin) { return NULL; } /* sbeginÀº ÀÌÁ¦ ct¿Í ÇÔ²² strspnÀ¸·Î È£ÃâµÈ´Ù. strspn ÀÇ ¿ªÇÒÀº sbegin¿¡¼­ ct¿¡ ¾ø´Â ¹®ÀÚ°¡ óÀ½À¸·Î Ÿ³ª ³ª´Â °÷ÀÇ À§Ä¡¸¦ µ¹·ÁÁØ´Ù. ÀÌÁ¦ sbeginÀº óÀ½À¸·Î ct ¿¡ ¼ÓÇÏÁö ¾Ê´Â sbegin³»¿¡ À§Ä¡¸¦ °¡¸£Å²´Ù. À§ÀÇ ¿¹¸¦ µé¸é "ab:cd::ef\0" : ct = ":" 0123456789 ¿¡¼­ sbeginÀº index 0À» °¡¸£Å³ °ÍÀÌ´Ù. */ sbegin += strspn(sbegin, ct); /* strspn ÇÔ¼ö »ç¿ë */ /* ¸¸ÀÏ sbeginÀÌ °¡¸£Å°´Â ¹®ÀÚ°¡ ³ÎÀ̶ó¸é ´õ ÀÌ»ó ºÐ¸®ÇÒ ÅäÅ«ÀÌ ¾øÀ¸¹Ç·Î ___strtokÀ» NULL·Î ¼¼ÆÃÇÏ°í NULLÀ» ¸® ÅÏÇÑ´Ù. */ if (*sbegin == '\0') { ___strtok = NULL; return (NULL); } /* strpbrk´Â strspn°ú´Â °Å²Ù·Î µ¿ÀÛÇÑ´Ù. Áï, sbegin¿¡¼­ ºÎÅÍ ½ÃÀÛÇÏ¿© ct¿¡ ÇØ´çÇÏ´Â ¹®ÀÚ°¡ ³ª¿À´Â ù À§Ä¡¸¦ Æ÷ ÀÎÅÍ·Î µ¹·ÁÁشٰí Çß´Ù. ¾Õ¼­ÀÇ ¿¹¸¦ µé¸é, "ab:cd::ef\0" : ct = ":" 0123456789 strpbrk¸¦ È£ÃâÇϸé ÇöÀç sbeginÀº index 0À» °¡¸£Å°°í ÀÖÀ¸ ¹Ç·Î ±× ¸®ÅÏ Æ÷ÀÎÅÍ´Â ct(":")°¡ óÀ½À¸·Î ³ª¿À´Â index 2 ¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ send·Î ³Ñ°ÜÁÙ °ÍÀÌ´Ù. */ send = strpbrk( sbegin, ct); /* strpkrk ÇÔ¼ö »ç¿ë */ send°¡ ³ÎÆ÷ÀÎÅÍ°¡ ¾Æ´Ï°í send°¡ ³Î¹®ÀÚ¸¦ °¡¸£Å°Áö ¾Ê´Â´Ù ¸é send°¡ °¡¸£Å°°í ÀÖ´Â index 2´Â '\0'¹®ÀÚ·Î µÇ°í sendÀÇ °ªÀº ÀÌÈÄÀÇ È£ÃâÀ» À§Çؼ­ 1ÀÌ Áõ°¡ÇÏ¿© ___strtok¿¡ ÀúÀåÀ» ÇÑ´Ù. sbeginÀº ÇöÀç ¾îµð¸¦ °¡¸£Å°°í Àִ°¡? ¸¶Áö¸·À¸·Î sbeginÀÌ »ç¿ëµÈ °÷Àº ¹Ù·Î À§ÀÇ index 0À» °¡¸£Å°°í ÀÖÀ» ¶§ÀÌ´Ù. µû¶ó¼­ index 0¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ÃÖÁ¾ÀûÀ¸·Î ¸®ÅÏ ÇÑ´Ù. ___strtokÀº ÇöÀç index 3¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ º¸À¯ÇÏ°í ÀÖ´Ù. */ if (send && *send != '\0') *send++ = '\0'; ___strtok = send; return (sbegin); } --------------------------------------------------------------------- ÀÌÁ¦ Á¤È®È÷ ÀÌÇØ°¡ µÇ´Â°¡? ³ª¸ÓÁöÀÇ ¹®ÀÚ¿­¿¡ ´ëÇؼ­µµ ÇÔ¼ö¸¦ µ¹·Á º¸¶ó. À§ÀÇ ÇÁ·Î±×·¥ÀÇ È帧°ú °°Àº °£´ÜÈ÷ ±×¸²À» ±×·Áº¸°Ú´Ù. ¾î¼Àºí¸® ·çƾ¿¡¼­ Âü°í°¡ µÉ °ÍÀÌ´Ù. [±×¸²1] ---------------------------------------------------------------------- 0ÀÌ ¾Æ´Ô s -------------> sbegin = s -------------> sbegin = ___strtok 0 ÀÓ 0 ÀÓ *sbegin ------------> ___strtok = 0, return 0 strpbrk(sbegin, ct) -----> send 0ÀÌ ¾Æ´Ô send && *send -------> *send++ = 0, ___strtok = send, return sbegin ----------------------------------------------------------------------- ÀÌ·¸°Ô ÀåȲÇÏ°Ô ¼³¸íÇÏ´Â °ÍÀº ¾î¼Àºí¸® ·çƾ¿¡¼­ÀÇ ºÎÇϸ¦ Á¶±ÝÀÌ¶óµµ ÁÙÀÌ °íÀÚ ÇÏ´Â ¸¶À½¿¡¼­ÀÌ´Ù. ÀÌÁ¦ ¾î¼Àºí¸® ·çƾÀ» ´ë·«ÀûÀ¸·Î »ìÆ캸ÀÚ. ----------------------------------------------------------------------- extern inline char * strtok(char * s,const char * ct) { register char * __res; __asm__ __volatile__( "testl %1,%1\n\t" "jne 1f\n\t" "testl %0,%0\n\t" "je 8f\n\t" "movl %0,%1\n" "1:\txorl %0,%0\n\t" "movl $-1,%%ecx\n\t" "xorl %%eax,%%eax\n\t" "cld\n\t" "movl %4,%%edi\n\t" "repne\n\t" "scasb\n\t" "notl %%ecx\n\t" "decl %%ecx\n\t" "je 7f\n\t" /* empty delimiter-string */ "movl %%ecx,%%edx\n" "2:\tlodsb\n\t" "testb %%al,%%al\n\t" "je 7f\n\t" "movl %4,%%edi\n\t" "movl %%edx,%%ecx\n\t" "repne\n\t" "scasb\n\t" "je 2b\n\t" "decl %1\n\t" "cmpb $0,(%1)\n\t" "je 7f\n\t" "movl %1,%0\n" "3:\tlodsb\n\t" "testb %%al,%%al\n\t" "je 5f\n\t" "movl %4,%%edi\n\t" "movl %%edx,%%ecx\n\t" "repne\n\t" "scasb\n\t" "jne 3b\n\t" "decl %1\n\t" "cmpb $0,(%1)\n\t" "je 5f\n\t" "movb $0,(%1)\n\t" "incl %1\n\t" "jmp 6f\n" "5:\txorl %1,%1\n" "6:\tcmpb $0,(%0)\n\t" "jne 7f\n\t" "xorl %0,%0\n" "7:\ttestl %0,%0\n\t" "jne 8f\n\t" "movl %0,%1\n" "8:" :"=b" (__res),"=S" (___strtok) :"0" (___strtok),"1" (s),"g" (ct) :"ax","cx","dx","di","memory"); return __res; } ------------------------------------------------------------------ * output ebx¸¦ ÅëÇÏ¿© __res·Î °ªÀ» Çϳª Àü´ÞÇÏ°í, (%0) esi¸¦ ÅëÇÏ¿© ___strtok Àü¿ªº¯¼ö¿¡ °ªÀ» Àü´ÞÇÑ´Ù. (%1) * input ebx¸¦ ÅëÇÏ¿© ___strtokÀÇ °ªÀ» Àü´ÞÇÏ°í, -- %0 esi¸¦ ÅëÇÏ¿© sÀÇ °ªÀ» Àü´ÞÇϸç, -- %1 ctÀÇ °ªÀÇ Àü´ÞÀº ÄÄÆÄÀÏ·¯¿¡°Ô ¸Ã±ä´Ù. (%4) ¿©±â¿¡¼­ ___strtokÀº ebx·Î °ªÀÌ Àü´ÞµÇÁö¸¸ ³ªÁß¿¡´Â esiÀÇ °è»ê°á°ú °¡ ___strtokÀ¸·Î ÀúÀåµÈ´Ù. ebx¿¡¼­´Â __res°¡ ³ª¿Â´Ù. ÀԷ°ú Ãâ·ÂÀÌ ¼­·Î ¾ù°¥¸®¹Ç·Î Àß »ìÆìºÁ¾ß ÇÑ´Ù. ÇÁ·Î±×·¥¿¡¼­´Â %0, %1, %4·Î °¢°¢ ebx¿Í esi,ct°¡ ÂüÁ¶µÇ°í ÀÖ´Ù. ctÀÇ °ªÀÌ Àü´ÞµÈ °÷Àº output, input ÀÇ ¼ø¼­¿¡ µû¶ó %2°¡ ¾Æ´Ï°í %4ÀÌ´Ù. * registers ¸®ÅÏÇÏ´Â ·¹Áö½ºÅÍ ebx, esi¸¦ Á¦¿ÜÇÑ "ax", "cx", "dx", "di", "memory" ¸¦ º¸È£ÇÏ°í ÀÖ´Ù. * commands ¸ÕÀú C¿¡¼­ char * __res¸¦ Çϳª ¼±¾ðÇÏ°í ÀÖ´Ù. ___strtokÀº Àü¿ªº¯¼ö ·Î ÀÌ¹Ì Á¸ÀçÇØ¾ß ÇÑ´Ù. ¶óº§´ÜÀ§·Î ©¶ó¼­ ÁýÁßÀûÀ¸·Î »ìÆ캸ÀÚ. /* if (s != NULL) goto 1; else if (___strtok == NULL) goto 8(return NULL); else __res = ___strtok; # s °¡ NULLÀÌ ¾Æ´Ï¸é »õ·Î¿î ¹®ÀÚ¿­¿¡ ´ëÇÑ ÀÛ¾÷ÀÌ ½ÃÀ۵ǹǷΠ1: ·Î °£´Ù(testl %1, %1; jne 1f). # ¸¸ÀÏ s°¡ NULLÀÏ °æ¿ì´Â ÀÌ¹Ì Àü´Ü°è¿¡¼­ ÀÛ¾÷ÀÌ ÁøÇàµÈ »óÅ·Πº¸¹Ç·Î ebx·Î Àü´ÞµÈ ___strtokÀÇ °ªÀÌ NULLÀÌ¸é ´õÀÌ»ó ºÐÇØÇÒ ÅäÅ«ÀÌ ¾ø´Ù´Â À̾߱Ⱑ µÈ´Ù. µû¶ó¼­ Á¾·áÇÑ´Ù(testl %0, %0; je 8f). Á¾·á½Ã¿¡´Â °á°ú°ªÀ¸·Î ÇöÀç ebx (¿ø·¡ÀÇ ___strtokÀÇ °ª: NULL)ÀÌ __res ·Î ¸®Åϵǰí, s°¡ NULL ÀÎ »óÅÂÀÌ°í, ÀÌ°ÍÀÌ esi¿¡ Àü´ÞµÇ¾úÀ¸¹Ç·Î ___strtok¿¡´Â NULLÀÌ ÀúÀåµÈ´Ù. (output Çʵå) # s °¡ NULLÀÌ°í ___strtokÀÌ NULLÀÌ ¾Æ´Ï¶ó¸é ÇöÀç ÀÛ¾÷ÀÌ ÁøÇàÁßÀÌ¹Ç ·Î esi(source index)·Î ¿Å±ä´Ù. esi´Â ¿ø·¡ ÀÛ¾÷ó·Î ¾²Àδ٠(movl %0, %1). */ "testl %1,%1\n\t" /* testl %%esi(s), %%esi */ "jne 1f\n\t" "testl %0,%0\n\t" /* testl %%ebx(___strtok), %%ebx */ "je 8f\n\t" "movl %0,%1\n" /* movl %%ebx(___strtok), %%esi */ /* __res = 0; ±×¸®°í ctÀÇ ¹®ÀÚ¿­ÀÇ ±æÀ̸¦ ±¸ÇÏ´Â ºÎºÐÀÌ´Ù. */ # ebx¸¦ 0À¸·Î ¸¸µç´Ù. (xorl %0, %0) # ctÀÇ ¹®ÀÚ¿­ÀÇ ±æÀ̸¦ ±¸Çϱâ À§ÇÑ °Ë»ç¹Ýº¹È½¼ö¸¦ 0xffffffff·Î ÇÏ¿© ecx¿¡ ÀúÀåÇÑ´Ù. (movl $-1, %%ecx) # eax¸¦ 0À¸·Î ¸¸µç´Ù. (xorl %%eax, %%eax) # ctÀÇ ±æÀ̸¦ ±¸Çϱâ À§ÇØ ct¸¦ dest index·Î ¿Å±ä´Ù. (movl %4,%%edi) # repne, scasb·Î al(ÇöÀç 0)ÀÇ °ªÀÌ edi°¡ °¡¸£Å°´Â °÷¿¡ ÀÖ´Â °ªÀÌ °°Àº Áö¸¦ ecx¸¸Å­ ¹Ýº¹ÇÑ´Ù. ediÀÇ °ªÀÌ º¯°æµÈ´Ù. # notl, decl·Î ecx¿¡ ctÀÇ ±æÀ̸¦ ±¸ÇÑ´Ù. # ¸¸ÀÏ ecx°¡ 0À̸é ct°¡ ""ÀÌ µÇ¹Ç·Î 7·Î °£´Ù. (je 7f) */ # ¼¼ºÎºñ±³È½¼öÀÎ ecx¸¦ ¾ÈÀüÇÑ edx¿¡ º¸°üÇÑ´Ù. (movl %%ecx,%%edx) "1:\txorl %0,%0\n\t" /* xorl %%ebx, %%ebx */ "movl $-1,%%ecx\n\t" /* °Ë»ç¹Ýº¹ Ƚ¼ö 0xffffffff -> ecx */ "xorl %%eax,%%eax\n\t" "cld\n\t" "movl %4,%%edi\n\t" /* movl (ct), %%edi */ "repne\n\t" "scasb\n\t" "notl %%ecx\n\t" "decl %%ecx\n\t" "je 7f\n\t" /* if (strlen(ct) == 0) goto 7; */ "movl %%ecx,%%edx\n" /* __res += strspn(__res, ct); strspn·çƾÀÌ´Ù. alÀÌ edi¼Ó¿¡ Æ÷ÇԵǴ°¡¸¦ »ìÆì¼­ Æ÷ÇÔµÈ´Ù¸é ·çÇÁ¸¦ ¹Ýº¹ÇÏ¿© óÀ½À¸·Î edi(ct)¼Ó¿¡ Æ÷ÇÔµÇÁö ¾Ê´Â °÷À» ±¸ÇÑ´Ù. s¹®ÀÚ¿­À» al·Î ²ø¾î¿Ã¸®´Â µµÁß¿¡ 0ÀÌ ¹ß°ßµÈ´Ù¸é ¹®ÀÚ¿­ÀÇ ³¡À̹ǷΠ7·Î °£´Ù. ÀÌ À̾߱â´Â s³»¿¡¼­ ÅäÅ« ºÐ¸®ÀÚ¸¦ ¸¸³ª°í ÀÖ´Â °¡¿îµ¥ '\0'À» ¸¸³­ ´Ù´Â À̾߱â´Ù. ÇöÀç __res = 0ÀÌ´Ù. µû¶ó¼­ 7¿¡¼­ NULLÀ» ÀúÀåÇÑ´Ù. °è»êµÈ esiÀÇ °ªÀ» ebx·Î ÀúÀåÇÏ´Â ºÎºÐÀ» ´«¿©°Ü ºÁµÎÀÚ. ÀÌ°ÍÀº output ¿¡¼­ __res·Î ¸®Å쵃 °ªÀÌ´Ù. */ "2:\tlodsb\n\t" /* al¿¡ esi(s)¿¡¼­ ÇϳªÀÇ ¹®ÀÚ¸¦ °¡Á®¿Â´Ù. */ "testb %%al,%%al\n\t" /* al ÀÌ 0À̸é 7 ·Î */ "je 7f\n\t" "movl %4,%%edi\n\t" /* edi°¡ º¯°æµÇ¾î¼­ ´Ù½Ã °¡Á®¿È ct ==> edi */ "movl %%edx,%%ecx\n\t" /* ¼¼ºÎºñ±³¿¡¼­ ¹Ýº¹È½¼ö¸¦ °¡Á®¿È */ "repne\n\t" /* al(0)ÀÇ °ª°ú edi°¡ °¡¸£Å°´Â °÷ÀÇ °ªÀÌ */ "scasb\n\t" /* °°À» ¶§±îÁö ºñ±³¹Ýº¹ */ "je 2b\n\t" /* °°´Ù¸é 2·Î */ "decl %1\n\t" /* ´Ù¸£´Ù¸é esi(s)¸¦ Çϳª °¨¼Ò */ "cmpb $0,(%1)\n\t" /* *esi(*s)¿¡¼­ ³ÎÀÌ ³ª¿Â´Ù¸é 7·Î */ "je 7f\n\t" "movl %1,%0\n" /* esi -> ebx */ /* send = strpbrk( __res, ct); if (send == NULL) goto 5; /* testb %%al, %%al; je 5f */ if (*send == '\0') goto 5; else *send++ = '\0'; ¿©±â´Â strpbrk ¿ªÇÒÀ» ÇÑ´Ù. À§¿¡¼­´Â del(¶Ç´Â ct)¿¡ ÇØ´çÇÏÁö ¾Ê´Â ¹® ÀÚ("ab:cd::ef"Áß 'a'°ú °°Àº °Í)¸¦ ã¾ÒÁö¸¸ ÀÌÁ¦´Â ÅäÅ«ºÐ¸®ÀÚ·Î ¾²ÀÌ ´Â del(ct -- ¿¹¿¡¼­´Â ":")¸¦ s³»¿¡¼­ ã´Â´Ù. µû¶ó¼­ s³»¿¡¼­ 0À» ¸¸ ³ª´õ¶óµµ __res´Â NULLÀÌ µÇÁö ¾Ê°í ___strtok¸¸ NULLÀÌ µÈ´Ù. "3:\tlodsb\n\t" /* esi¿¡¼­ ÇϳªºÒ·¯¼­ al ·Î */ "testb %%al,%%al\n\t" /* esiÀÇ ÇöÀç¹®ÀÚ°¡ 0À̸é 5 ·Î */ "je 5f\n\t" "movl %4,%%edi\n\t" /* edi°¡ º¯°æµÇ¾î¼­ ´Ù½Ã °¡Á®¿È ct ==> edi */ "movl %%edx,%%ecx\n\t" /* ¹Ýº¹È½¼ö¸¦ °¡Á®¿È */ "repne\n\t" /* al ÀÇ ¹®ÀÚ¿Í ediÀÇ ¹®ÀÚ¸¦ Ƚ¼ö¸¸Å­ ºñ±³ */ "scasb\n\t" "jne 3b\n\t" /* sÀÇ ÇöÀç¹®ÀÚ°¡ ct¿¡ ³ª¿ÀÁö ¾Ê´Â´Ù¸é 3À¸·Î*/ "decl %1\n\t" /* ³ª¿Ô´Ù¸é esi¸¦ Çϳª°¨¼Ò */ "cmpb $0,(%1)\n\t" /* *esi°¡ 0Àΰ¡¸¦ °Ë»ç */ "je 5f\n\t" /* ³ÎÀ̸é 5·Î */ "movb $0,(%1)\n\t" /* 0À» *esi(*s)¿¡ Ãß°¡ */ "incl %1\n\t" /* esi¸¦ ÇϳªÁõ°¡½ÃÅ°°í 6À¸·Î */ "jmp 6f\n" /* ___strtok = NULL */ "5:\txorl %1,%1\n" /* esi¸¦ 0À¸·Î ¸¸µë */ /* if ( *send != '\0') goto 7; if ( *send == '\0') ___strtok = NULL; */ "6:\tcmpb $0,(%0)\n\t" /* *ebx°¡ 0ÀÎÁö °Ë»çÇؼ­ ¾Æ´Ï¸é 7·Î */ "jne 7f\n\t" "xorl %0,%0\n" /* *ebx°¡ 0À̸é ebx¸¦ 0À¸·Î ¸¸µë */ /* if (__res != 0) goto 8; else ___strtok = __res; "7:\ttestl %0,%0\n\t" /* ebx°¡ 0ÀÎÁö °Ë»çÇؼ­ ¾Æ´Ï¶ó¸é 8·Î */ "jne 8f\n\t" "movl %0,%1\n" /* ebx ¸¦ esi·Î */ /* return __res; */ "8:" :"=b" (__res),"=S" (___strtok) :"0" (___strtok),"1" (s),"g" (ct) :"ax","cx","dx","di","memory"); return __res; } --------------------------------------------------------------------- »ó´çÈ÷ º¹ÀâÇÔÀ» ´À³¥ °ÍÀÌ´Ù. ÇÏÁö¸¸ Áß°£ Áß°£ ¶óº§ ´ÜÀ§·Î ÇØ´çÇÏ´Â CÀÇ ÇüŸ¦ ±â¼úÇØ µÎ¾úÀ¸¹Ç·Î ºñ±³Àû ÀÌÇØ°¡ µÉ °ÍÀÌ´Ù. ¶óº§ 1¹ø ÀÌÀü¿¡´Â ebx, esi°¡ input°ú output ÀÌ È¥ÀçÇÏ´Â »óȲÀ̹ǷΠÀß ¿¬°ü½ÃÄÑ¾ß ÇÑ´Ù. 1¹øÀÌÈĺÎÅÍ´Â ebx´Â __res¿Í esi´Â ___strtok°ú ¿¬°üÀ» ½ÃÄѼ­ À¯½ÉÈ÷ »ìÆ캸ÀÚ. °°Àº ¼Ò½ºÀÌÁö¸¸ C·Î ÇÏ´Â °Íº¸´Ù ¾î ¼Àºí¸®¾î·Î ±â¼úÇÏ¸é ¶óº§·ÎÀÇ Á¡ÇÁ ¶§¹®¿¡ ¾ó¸¶³ª È¥À⽺·¯¿îÁö ³³µæ ÀÌ °¥°ÍÀÌ´Ù. ÀÌÇØ°¡ Àß µÇ´Â°¡? ³ª¸§´ë·Î ÀÌÇظ¦ ÇÏ¼Ì´Ù¸é ¿©·¯ºÐµµ ÀÌÁ¦ AT&TÀÎ ¶óÀÎ ¾î¼Àºí¸®¿¡ ¾î´ÀÁ¤µµ Àͼ÷ÇØÁ³´Ù°í º¼ ¼ö ÀÖÀ¸¸ç °£´ÜÇÑ ·çƾ Àº ÀÚ½ÅÀÇ ¼Ò½º¿¡ Æ÷ÇÔÀ» ½Ãų ¼ö ÀÖ´Â ´É·ÂÀ» °¡Á³´Ù°í ºÁµµ °ú¾ð ÀÌ ¾Æ´Ò°ÍÀÌ´Ù. ¾Æ¿ï·¯ Ä¿³Î ¼Ò½º °°Àº °÷¿¡¼­ ³ª¿À´Â ÀζóÀÎ ¾î¼À ºí¸®µµ Àß ³³µæÀÌ µÉ °ÍÀÌ´Ù. º¸È£¸ðµå¸¸ Á¦¿ÜÇÑ´Ù¸é.. À̹ø ½Ã°£¿¡´Â strtok Çϳª¸¸À¸·Î 400¶óÀÎÀ» Â÷ÁöÇÑ °Í °°´Ù. ¸¶ÀÇ strtokÀ» ÀÌÇØÇϽŠºÐ¿¡°Ô ÈûÂù ¹Ú¼ö¸¦ º¸³»°í ½Í´Ù. ^^; °í¼öÀÇ ÀÔÀå¿¡¼­ º¸¸é ¾ðÁ¦³ª ½¬¿î ¹®Á¦°ÚÁö¸¸ ¿ì¸®°°Àº Ãʺ¸¿¡°Ô´Â Èûµé µû¸§ÀÌ´Ù. ¿©·¯ºÐµéÀÌ Ä¿³Î¼Ò½º³ª ¾î¼Àºí¸® °ü·Ã ¼Ò½º¸¦ °øºÎÇÒ ±â ȸ°¡ ÀÖ´ÙÇÏ´õ¶óµµ ÇÑ ¸ðµâÀÌ ÀÌ ¸¸Å­ ¸¹ÀÌ ³ª¿À´Â °ÍÀº º¸±â°¡ Èû µé °ÍÀ¸·Î ¹Ï´Â´Ù. ¾Æ¸¶ ÇÊÀÚµµ À̸»À» Á¦¹ø¹÷ ÇÒ ÀÏÀÌ ÀÖÀ» Áöµµ ¸ð¸£°ÚÁö¸¸.. ´ÙÀ½½Ã°£±îÁö Ç« ½¬¾ú´Ù°¡ ³ª¸ÓÁö ÀÛÀº ¸î°³ÀÇ ·çƾµé¹Û¿¡ ¾È³²¾Ò À¸´Ï ÈûÀ» ³»°í µµÀüÇغ¸ÀÚ. ¹º°¡ Çϳª Á¤µµ´Â ³¡À» ºÁ¾ß ÇÒ°Ô ¾Æ ´Ñ°¡? ´ÙÀ½½Ã°£ÀÌ ¸¶Áö¹ÚÀÌ µÉ °Í °°´Ù. ¶ÇÄ¡ Çѵ¿ÈÆ Ãâ·ÂÀÌ ³¡³µ½À´Ï´Ù. [Enter]¸¦ ´©¸£½Ê½Ã¿À. Nownuri ¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡ LINUX ¸®´ª½º Çдç-¸®´ª½º °­Á / ¿¬Àç 1/¸¶Áö¸· ¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡ (LT : ¾î¼À) ¹øÈ£ ¿Ã¸°ID ÀÌ ¸§ ³¯ Â¥ ÀÐÀ½ ÂÊ Á¦ ¸ñ ------------------------------------------------------------------------------ 751 hetta À̱âõ 07/05 317 26 [°­ÁÂ] C¿Í ¾î¼Àºí¸®ÄÚµå (1) 406 ddoch Çѵ¿¿í 02/20 1574 19 [°­ÁÂ06] ÀζóÀÎ ¾î¼Àºí¸®¸¦ ºÐ¼®ÇÏÀÚ! 405 ddoch Çѵ¿¿í 02/20 1424 32 [°­ÁÂ05] ÀζóÀÎ ¾î¼Àºí¸®¸¦ ºÐ¼®ÇÏÀÚ! 404 ddoch Çѵ¿¿í 02/19 1429 30 [°­ÁÂ04] ÀζóÀÎ ¾î¼Àºí¸®¸¦ ºÐ¼®ÇÏÀÚ! 403 ddoch Çѵ¿¿í 02/19 1440 28 [°­ÁÂ03] ÀζóÀÎ ¾î¼Àºí¸®¸¦ ºÐ¼®ÇÏÀÚ! 402 ddoch Çѵ¿¿í 02/19 1902 21 [°­ÁÂ02] ÀζóÀÎ ¾î¼Àºí¸®¸¦ ºÐ¼®ÇÏÀÚ! 400 ddoch Çѵ¿¿í 02/18 2702 31 [°­ÁÂ01] ÀζóÀÎ ¾î¼Àºí¸®¸¦ ºÐ¼®ÇÏÀÚ! ¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡ ¸í·É¾î¾È³»(C) µµ¿ò¸»(H) ÃʱâÈ­¸é(T) À̵¿(GO,P,A,N,B) ù°Ô½Ã¹°(L) Á¾·á(X) ¼±ÅÃ> pr 405 PRINTER/CAPTURE °¡ ÁغñµÇ¾ú½À´Ï±î(Y/n) ? ¡º¸®´ª½º Çдç-¸®´ª½º °­Á / ¿¬Àç (go LINUX)¡» 405¹ø Á¦ ¸ñ:[°­ÁÂ05] ÀζóÀÎ ¾î¼Àºí¸®¸¦ ºÐ¼®ÇÏÀÚ! ¿Ã¸°ÀÌ:ddoch (Çѵ¿¿í ) 97/02/20 19:29 ÀÐÀ½:1424 °ü·ÃÀÚ·á ¾øÀ½ ----------------------------------------------------------------------------- 2.15 memcpy ÀÌÁ¦ ºÎÅÍ´Â ÀÛÀº °Í ¸î °³¸¸ º¸¸é ³¡³¯ °ÍÀÌ´Ù. Ǫ±ÙÈ÷ ¸¶À½À» °¡ Áö°í ¿©À¯ÀÖ°Ô »ìÆ캸µµ·Ï ÇÏÀÚ. ±æ¾îºÁ¾ß 10ÁÙÂ¥¸® µéÀÌ´Ù. --------------------------------------------------------------------- extern inline void * __memcpy(void * to, const void * from, size_t n) { __asm__ __volatile__( "cld\n\t" "rep ; movsl\n\t" "testb $2,%b1\n\t" "je 1f\n\t" "movsw\n" "1:\ttestb $1,%b1\n\t" "je 2f\n\t" "movsb\n" "2:" : /* no output */ :"c" (n/4), "q" (n),"D" ((long) to),"S" ((long) from) : "cx","di","si","memory"); return (to); } ---------------------------------------------------------------------- memcpy ´Â Àß ¾Æ½Ã´Ù½ÃÇÇ from¿¡¼­ to·Î n¹ÙÀÌÆ®¸¦ ¸Þ¸ð¸® º¹»çÇÑ´Ù. * output memory º¹»ç À̹ǷΠ¹Ýȯ°ªÀº ¾ø´Ù. * input "q"´Â ax, bx, cx, dx Áß ÇϳªÀÇ ·¹Áö½ºÅÍ¿¡ 'n'ÀÇ °ªÀ» ÇÒ´çÇÏ°Ú ´Ù°í ÄÄÆÄÀÏ·¯¿¡°Ô ÀÏ·¯ÁÖ´Â °ÍÀÌ´Ù. ecx¿¡ n/4¸¦, "q"¿¡ nÀ», edi¿¡ (long)to¸¦, esi¿¡ (long)fromÀ» °¢±â °ªÀ» Àü´ÞÇÑ´Ù. (long)°ú °°ÀÌ Æ¯Á¤ÇÏ°Ô ÇüÀ» º¯È¯ÇÔÀ¸·Î½á ±× Å©±â¿¡ µû¸¥ ·¹Áö½ºÅÍ(¿©±â¿¡¼­´Â ediµî..)À» »ç¿ëÇÒ ¼ö ÀÖ´Ù. to´Â º¹»çµÉ °÷À̹ǷΠdest index¿¡ ³Ö¾îµÎ°í, fromÀº º¹»çÇÒ °÷ À̹ǷΠsource index¿¡ °ªÀ» ÀúÀåÇÏ¿© ÀÌÈÄ¿¡ ¹®ÀÚ¿­ °ü·Ã ¸í·É À» »ç¿ëÇÏ¿© ¿øÇÏ´Â ÀÛ¾÷À» ÇÒ ¼ö ÀÖ´Ù. * commands rep; movsl°ú °°ÀÌ ¸í·ÉµéÀ» ';'·Î ºÐ¸®ÇÏ¿© ÇÑÁÙ¿¡ ÀûÀ» ¼öµµ ÀÖ´Ù. ÀÌ ¸í·É¿¡ ÀÇÇØ esi(from)¿¡¼­ edi(to)·Î n/4¸¸Å­ º¹»çµÈ´Ù. Çѹø º¹»çµÉ ¶§´Â 4¹ÙÀÌÆ®(movsl-long)¾¿ µÇ¹Ç·Î ¸¸ÀÏ nÀ» 15·Î ÁÙ °æ¿ì´Â 4ÀÇ ¹è¼öÀÎ 12¸¸Å­ º¹»çµÇ°í 3¹ÙÀÌÆ®°¡ ³²°Ô µÈ´Ù. ÀÌ·¸°Ô 4¹ÙÀÌÆ® ´ÜÀ§·Î º¹»çÇÏ´Â °ÍÀÌ 4¹ÙÀÌÆ®°¡ ±âº» µ¥ÀÌŸ ÇüÀÎ 32ºñÆ® ¿î¿µÃ¼Á¦ ¿¡¼­ ´õ È¿À²¼ºÀÌ ÁÁÀº ¸ð¾çÀÌ´Ù. ³ª¸ÓÁö 3¹ÙÀÌÆ®´Â µÚ¿¡¼­ º¹»ç¸¦ ÇÑ´Ù. Áß°£¿¡ %b1(%bl-%BL°ú È¥µ¿ÇÏÁö ¸»¶ó)ÀÌ ÀÖ´Â µ¥ ÀÌ°ÍÀº ¾Æ¸¶µµ %1+ byte ÀÇ Àǹ̰°´Ù. Áï, %1Àº nÀÇ °ªÀ̹ǷΠtestb $2, %b1Àº nÀÇ ÇÏÀ§ 1¹ÙÀÌÆ®¿Í »ó¼ö 2¸¦ & ¿¬»êÀ» ÇÑ´Ù´Â À̾߱â·Î Çؼ®Çϸé Á¤È®ÇÒ °Í°° ´Ù. 15¹ÙÀÌÆ® ÀÏ °æ¿ì¸¦ ¿¹·Î µé¸é, 15 : 1111 2 : 0010 & ----------- 0010 Áï, ÀÌ ¿¬»êÀº nÀÇ 2¹ø° ºñÆ®°¡ 1ÀÎÁö¸¦ °Ë»çÇÑ´Ù. 0À̶ó¸é 1ù¹ø° ºñÆ®¸¦ °Ë»çÇÏ´Â 1f·Î °¡°í, 1À̶ó¸é 2ºñÆ®¸¦ º¹»ç¸¦ ÇÏ°í 1¹ø° ºñÆ® ¸¦ testb $1, %b1°ú °°ÀÌ °Ë»çÇÏ¿© 1À̸é 1¹ÙÀÌÆ®¸¦ ´õ º¹»çÇÏ°í, 0ÀÌ ¸é Á¾·áÇÑ´Ù. ¾ÆÁÖ ½±°Ô ÀÌÇØ°¡ µÉ °ÍÀÌ´Ù. À̹ø¿¡´Â ¾ÆÁÖ Àç¹ÌÀÖ´Â ·çƾÀÌ´Ù. ÀζóÀÎ ¾î¼Àºí¸®¸¦ ¾î¶»°Ô C ¿¡¼­ define Çؼ­ »ç¿ëÇÒ ¼ö ÀÖ´Â ÁöÀÇ ÇϳªÀÇ ¿¹·Î¼­ Èï¹Ì·Ó°Ô »ìÆ캸ÀÚ. ----------------------------------------------------------------------- /* * This looks horribly ugly, but the compiler can optimize it totally, * as the count is constant. */ extern inline void * __constant_memcpy(void * to, const void * from, \ size_t n) { switch (n) { case 0: return to; case 1: *(unsigned char *)to = *(const unsigned char *)from; return to; case 2: *(unsigned short *)to = *(const unsigned short *)from; return to; case 3: *(unsigned short *)to = *(const unsigned short *)from; *(2+(unsigned char *)to) = *(2+(const unsigned char *)from); return to; case 4: *(unsigned long *)to = *(const unsigned long *)from; return to; } #define COMMON(x) \ __asm__("cld\n\t" \ "rep ; movsl" \ x \ : /* no outputs */ \ : "c" (n/4),"D" ((long) to),"S" ((long) from) \ : "cx","di","si","memory"); switch (n % 4) { case 0: COMMON(""); return to; case 1: COMMON("\n\tmovsb"); return to; case 2: COMMON("\n\tmovsw"); return to; case 3: COMMON("\n\tmovsw\n\tmovsb"); return to; } #undef COMMON } ---------------------------------------------------------------------- ¸®´©½º Åä¹ßÁî Àڽŵµ À̹ø ·çƾÀº ¸ø»ý°å´Ù°í ¸»ÇÏ°í ÀÖ´Â µíÇÏ´Ù. C ÀÇ case ¹®Àº nÀÌ 0ÀÏ ¶§´Â ±×³É ¸®ÅÏÇÏ°í, 1,2,3À϶§´Â unsigned char *, unsigned short *,·Î void *¸¦ Çüº¯È¯ÇÏ¿© Æ÷ÀÎÅ͸¦ »ç¿ëÇÏ¿© °ªÀ» ±×´ë·Î ¸Þ¸ð¸®·Î Àû°í ÀÖ´Ù. void *ÀÇ À¯¿ëÇÑ Á¡Àº ¾î¶°ÇÑ Æ÷ÀÎÅÍ ÇüÀ¸·Îµµ º¯È¯µÉ ¼ö ÀÖ´Ù´Â µ¥ ÀÖ´Â µ¥, ÀÌ°ÍÀ» Àß È°¿ëÇÏ°í ÀÖ´Â ¼ÀÀÌ´Ù. from°ú to¸¦ *(unsigned char *)·Î °ªÀ» Àû´Â ´Ù¸é ÇØ´çÇÏ´Â °÷¿¡ 1¹ÙÀÌÆ®¸¦ Àû°Ô µÇ°í *(unsigned short *)·Î ÃëÇϸé 2¹ÙÀÌÆ®¸¦ Àû°Ô µÈ´Ù. ´ç¿¬È÷ unsigned long À» ÃëÇϸé 4¹ÙÀÌÆ®¸¦ Àû°Ô µÈ´Ù. ÀÌ °æ¿ìÀÇ Æ÷ÀÎÅÍ¿¡ 1,2,3 µîÀÇ ¿¬»êÀº ±× ¾î¶°ÇÑ Æ÷ÀÎÅÍ·Î ÇØ´çÇÏ´Â ÁÖ¼Ò°¡ ÂüÁ¶µÇ¾ú´À³Ä¿¡ µû¶ó¼­, Áõ°¡ÇÏ´Â ÆøÀÌ ´Þ ¶óÁø´Ù. const´Â fromÀÌ °¡¸£Å°°í ÀÖ´Â °÷ÀÇ µ¥ÀÌŸ¸¦ »ó¼öÇüÅ·ΠÃë±ÞÇÔÀ¸ ·Î½á º¯°æÀ» ±ÝÁöÇÔÀ» ÄÄÆÄÀÏ·¯¿¡°Ô ¾Ë¸®°í ÀÖ´Ù. ¸¶Âù°¡Áö·Î 8,12...20°ú °°ÀÌ ÀûÀº ¼ö¿¡´Â ±×³É ¹Ù·Î Æ÷ÀÎÅÍ ¿¬»êÀ¸·Î °ªÀ» º¹»çÇÑ´Ù. COMMONÀº ¿©±â¿¡¼­ ƯÁ¤ºÎºÐ¿¡¸¸ Á¤ÀǵȴÙ. ÀζóÀÎ ¾î¼À¿¡¼­ °øÅëµÇ´Â ºÎºÐ À» µû·Î ºÐ¸®ÇÏ¿© Á¤ÀÇÇÑ °ÍÀÌ´Ù. ³»ºÎÀÇ ÀζóÀÎ ¾î¼ÀÀ» º¸¸é.. ecx¿¡ n/4¸¦, edi¿¡ to¸¦, esi¿¡ fromÀ» Àü´ÞÇÏ°í ÀÖ´Ù. cld; rep; movsl; ·Î ÀÎÇÏ¿© n/4¸¸Å­ from¿¡¼­ to·Î 4¹ÙÀÌÆ® ´ÜÀ§·Î º¹»ç¸¦ ÇÑ´Ù. ³ª¸ÓÁö ³²Àº ¿©ºÐÀÇ 1-3¹ÙÀÌÆ®´Â define À» ÀûÀýÈ÷ È°¿ëÇÑ´Ù. COMMAN("\n\tmovsb")´Â À§ÀÇ define¿¡ ÀÇÇØ __asm__("cld\n\t" \ "rep; movsl" \ "\n\tmovsb" \ : .. ..... ); ·Î Çؼ®ÀÌ µÈ´Ù. ³ª¸ÓÁöÀÇ °æ¿ìµµ n%4¹ÙÀÌÆ® ¸¸Å­ º¹»ç¸¦ Çϱâ À§ÇÏ¿© define À» È°¿ëÇÑ´Ù. 2.16 memmove memmove´Â src¿¡¼­ dest·Î n¹ÙÀÌÆ®¸¸Å­À» ¸Þ¸ð¸® À̵¿À» ½ÃÅ°´Â °ÍÀÌ´Ù. memcpy¿Í °ÅÀÇ ºñ½ÁÇÏ´Ù°í º¼ ¼ö ÀÖÀ¸³ª src¿Í dest°¡ °ãÄ¡´Â °æ¿ì¸¦ ´ëºñÇÏ¿© Á¤»óÀûÀÎ °ªÀ» º¹»çÇÑ´Ù´Â Á¡¿¡¼­ Á¶±Ý Â÷ÀÌ°¡ ÀÖ´Ù. -------------------------------------------------------------------- extern inline void * memmove(void * dest,const void * src, size_t n) { if (dest= ¿øõÁö ÁÖ¼Ò ÀÏ °æ¿ì·Î ³ª´©¾î ó¸®ÇÏ°í ÀÖ´Ù. ÀϹÝÀûÀ¸·Î µÎ°³ÀÇ ¿µ¿ªÀÌ °ãÄ¡Áö ¾Ê´Â´Ù¸é º° ¹®Á¦ ¾øÀÌ Ã³¸®µÇÁö¸¸ °ãÄ¡´Â °æ¿ì¸¦ ¿¹·Î µé¾îº¸ÀÚ. ´ÙÀ½°ú °°ÀÌ ±×¸²À» ±×·Áº¸¸é, (1) dest < src <------ low address high address ------------> dest ¿µ¿ª -------------------------+ | +-------------------------------------------------------------+ | dest ¿µ¿ª | °ãÄ¡´Â ¿µ¿ª | src ¿µ¿ª | +-------------------------------------------------------------+ abcdefg.... |12345..... +--------------------- src ¿µ¿ª ÀÌ °æ¿ì¿¡´Â srcÀÇ 12345ºÎÅÍ Â÷·Ê´ë·Î destÀÇ abcdef...·Î º¹»ç¸¦ ÇØ ÁÖ¸é º° ÀÌ»ó¾ø´Ù. ecx¿¡´Â n, esi¿¡´Â src, edi¿¡´Â dest°¡ Àü´ÞµÇ¾î cld; rep; movsb;·Î Á¤¹æÇâÀ¸·Î src¿¡¼­ dest·Î n¸¸Å­ ¹ÙÀÌÆ® º¹»ç¸¦ ÇÏ°Ô µÈ´Ù. (2) src <= dest <------ low address high address ------------> src ¿µ¿ª -------------------------+ | +-------------------------------------------------------------+ | src ¿µ¿ª | °ãÄ¡´Â ¿µ¿ª | dest ¿µ¿ª | +-------------------------------------------------------------+ 12345... |abcde.. ..789 ...xyz +--------------------- dest ¿µ¿ª ÀÌ °æ¿ì¿¡´Â 12345...(src)¿¡¼­ abcde..(dest)·Î ¹Ù·Î º¹»ç¸¦ Çعö¸° ´Ù¸é º¹»ç¸¦ ä ´ÙÇϱ⵵ Àü¿¡ srcÀÇ µÞºÎºÐÀÇ °ªÀÌ º¯°æµÇ¾î ¹ö·Á¼­ Á¤»óÀûÀÎ º¹»ç°¡ ÀÌ·ç¾î ÁöÁö ¾ÊÀ» °ÍÀÌ´Ù. À̶§¿¡´Â srcÀÇ µÞºÎºÐÀÎ 9,8,7 ºÎÅÍ destÀÇ µÞºÎºÐÀÎ z,y,x·Î º¹»ç¸¦ °Å²Ù·Î Çϸé Á¤»óÀûÀÎ º¹ »ç¸¦ ÇÒ ¼ö ÀÖ´Ù. ecx¿¡ n, esi¿¡ (n-1+(const char *)src)¸¦, edi¿¡ (n-1+(char *)dest )¸¦ °¢°¢ Àü´ÞÇÏ°í ÀÖ´Ù. Áï, src, dest¿¡¼­ n¸¸Å­À» ´õÇÑ ÁÖ¼Ò¸¦ °¡ ¸£Å²´Ù. std; rep; movsb·Î À̹ø¿¡´Â °Å²Ù·Î srcÀÇ µÞºÎºÐ¿¡¼­ dest ÀÇ µÞºÎºÐÀ¸·Î ¹ÙÀÌÆ® ¸Þ¸ð¸® º¹»ç°¡ n¹ø ÀÌ·ç¾îÁø´Ù. 2.17 memchr memchrÀº strchrÀÇ ¸Þ¸ð¸® ¹öÁ¯ÀÌ´Ù. --------------------------------------------------------------- extern inline void * memchr(const void * cs,int c,size_t count) { register void * __res; if (!count) return NULL; __asm__ __volatile__( "cld\n\t" "repne\n\t" "scasb\n\t" "je 1f\n\t" "movl $1,%0\n" "1:\tdecl %0" :"=D" (__res):"a" (c),"D" (cs),"c" (count) :"cx"); return __res; } ----------------------------------------------------------------- cs°¡ °¡¸£Å°´Â ¸Þ¸ð¸®¿¡¼­ ½ÃÀÛÇÏ¿© cÀÇ °ªÀÌ ÀÖ´ÂÁö¸¦ count¹ø °Ë»ç ¸¦ ÇÑ´Ù. outputÀº edi·Î ÅëÇؼ­ __res·Î °á°ú°ªÀÌ Àü´ÞµÇ°í,inputÀº eax¿¡ ã°íÀÚÇÏ´Â °ª c¸¦, edi¿¡ cs¸¦, ecx¿¡ count¸¦ °¢°¢ Àü´ÞÇÏ°í ÀÖ´Ù. ¸ÕÀú C¿¡¼­ void * __res¸¦ ¼±¾ðÀ» ÇÏ°í count°¡ 0À̶ó¸é NULL À» ¸®ÅÏÇÑ´Ù. ¾Æ´Ï¶ó¸é ¾î¼Àºí¸® ·çƾÀ» ½ÇÇàÇÑ´Ù. eax¿¡´Â int aÀÇ °ªÀÌ µé¾î°¡ ÀÖÀ¸³ª »ç½Ç»óÀº eaxÀÇ ÇÏÀ§ 1¹ÙÀÌÆ®ÀÎ al¸¸ÀÌ °Ë»ç¸¦ À§Çؼ­ »ç¿ëµÈ´Ù. cld; repne; scasb; ´Â ecx(count) ¹ø al(aÀÇ ÇÏÀ§1¹ÙÀÌÆ®)ÀÇ °ª°ú edi(cs)°ªÀ» ºñ±³ÇÏ¿© °°Áö ¾Ê´Ù¸é °è¼Ó ¹Ýº¹ÇÏ¿© °°Àº °ªÀÌ ³ª¿À¸é ±× ´ÙÀ½À» edi°¡ °¡¸£Å²´Ù. µû¶ó¼­ ¹ß°ßÇÑ´Ù¸é je 1f·Î decl %%edi¸¦ ÇÏ¿© Çϳª¸¦ °¨¼Ò½ÃŲ ´ÙÀ½ÀÇ ¸Þ¸ð ¸® À§Ä¡¸¦ __res·Î ³Ñ°ÜÁØ´Ù. °°Àº °ªÀ» ãÁö ¸øÇß´Ù¸é movl $1, %%edi¸¦ ÇÏ¿© edi¿¡ 1À» ÀúÀåÇÏ°í decl %%edi·Î 0ÀÌ µÇ¾î __res´Â NULLÆ÷ÀÎÅ͸¦ ¸®ÅÏÇÑ´Ù. 2. 18 memset -------------------------------------------------------------- extern inline void * __memset_generic(void * s, char c, \ size_t count) { __asm__ __volatile__( "cld\n\t" "rep\n\t" "stosb" : /* no output */ :"a" (c),"D" (s),"c" (count) :"cx","di","memory"); return s; } --------------------------------------------------------------- al(eax)¿¡ c¸¦, edi¿¡ s¸¦, ecx¿¡ count¸¦ Àü´ÞÇÏ°í ÀÖ´Ù. cld; rep; stasb; ·Î al(c)ÀÇ °ªÀ» edi(s)°¡ °¡¸£Å°´Â °÷¿¡ ecx(count)¹ø ¹Ýº¹ ÇÏ¿© ¾´´Ù. ----------------------------------------------------------------------- /* * memset(x,0,y) is a reasonably common thing to do, so we want to fill * things 32 bits at a time even when we don't know the size of the * area at compile-time.. */ extern inline void * __constant_c_memset(void * s, unsigned long c, \ size_t count) { __asm__ __volatile__( "cld\n\t" "rep ; stosl\n\t" "testb $2,%b1\n\t" "je 1f\n\t" "stosw\n" "1:\ttestb $1,%b1\n\t" "je 2f\n\t" "stosb\n" "2:" : /* no output */ :"a" (c), "q" (count), "c" (count/4), "D" ((long) s) :"cx","di","memory"); return (s); } ----------------------------------------------------------------------- eax¿¡ unsigned long c¸¦, eax, ebx, ecx, edx Áß Çϳª¿¡ count¸¦, ecx¿¡ count/4¸¦, edi¿¡ s¸¦ Àü´ÞÇÏ°í ÀÖ´Ù. °ªÀ» Àü´ÞÇÒ ¶§ Àü´ÞµÇ´Â ÀÎÀÚÇüÀÇ Å©±â¿¡ µû¶ó¼­ commands±¸¹®¿¡¼­ ÀûÀýÈ÷ »ç¿ëÇÏ¿©¾ß ÇÑ´Ù. ±×·¸Áö ¾Ê´Ù¸é ¹ö±×°¡ µÉ ¼ö ÀÖÀ» °ÍÀÌ´Ù. cld; rep; stosl;·Î eaxÀÇ °ªÀ» edi(s)°¡ °¡¸£ Å°´Â °÷¿¡ 4¹ÙÀÌÆ®¾¿ ecx(count/4)¸¸Å­À» ¹Ýº¹ÇÏ¿© ¾´´Ù. ÀÌÀü¿¡ º»¹Ù¿Í ¸¶Âù°¡Áö·Î testb $2, %b1; testb $1, %b1; °ú °°Àº °ÍÀ¸·Î countÀÇ ÇÏÀ§ 2,1¹ø° ºñÆ®¸¦ °Ë»çÇÏ¿© °¢°¢ 2¹ÙÀÌÆ®, 1¹ÙÀÌÆ®¸¦ ax, al¿¡¼­ °¡Á®¿Í¼­ ¾²°í ÀÖ´Ù. 2.19 strnlen ---------------------------------------------------------------------- /* Added by Gertjan van Wingerde to make minix and sysv module work */ extern inline size_t strnlen(const char * s, size_t count) { register int __res; __asm__ __volatile__( "movl %1,%0\n\t" /* ecx -> eax */ "jmp 2f\n" "1:\tcmpb $0,(%0)\n\t" /* cmpb $0, [eax] */ "je 3f\n\t" "incl %0\n" /* eax++ */ "2:\tdecl %2\n\t" /* edx-- */ "cmpl $-1,%2\n\t" /* cmpl $-1, edx */ "jne 1b\n" "3:\tsubl %1,%0" /* eax -= ecx */ :"=a" (__res):"c" (s),"d" (count)); return __res; } /* end of additional stuff */ ---------------------------------------------------------------------- outputÀº eax¸¦ ÅëÇؼ­ __res¿¡ Àü´ÞµÇ°í ÀÖ´Ù. ecx¿¡´Â s¸¦, edx¿¡´Â count ¸¦ inputÀ¸·Î Àü´ÞÇÏ°í ÀÖ´Ù. strnlen("abc", 3); strnlen("abc", 5); strnlen("abc", 2); ·Î ÇÏ¿© °¢°¢ È£ÃâÇϸé 3, 3, 2¸¦ ¸®ÅÏÇÑ´Ù. Áï, count¾È¿¡¼­ s¿¡¼­ ³ÎÀÌ ³ª¿À¸é ±× ±æÀÌ ¸¦ µ¹·ÁÁÖ°í ³ª¿ÀÁö ¾ÊÀ¸¸é count ¸¸Å­À» ¸®ÅÏÇÏ´Â °ÍÀÌ´Ù. cmpb $0, (%0)Àº sÀÇ º¹»çº» Æ÷ÀÎÅ͸¦ Çϳª Áõ°¡ ½ÃÅ°°í, incl %0Àº sÁß ³Î ÀÌ ¾Æ´Ï¶ó¸é ´ÙÀ½ °÷À» °¡¸£Å°°Ô Çϸç decl %2´Â countÀÇ º¹»çº»À» Çϳª °¨ ¼Ò½ÃÅ°¸é¼­ sÁß ³Î¹®ÀÚ¸¦ ¸¸³ª°Å³ª cmpl $=1, %2; ó·³ countÀÇ º¹»çº»ÀÌ -1ÀÌ µÇ¸é ÁøÇàµÈ sÀÇ º¹»çº»¿¡¼­ ¿ø·¡ sÀÇ °ªÀ» »©¼­ µ¹·ÁÁØ´Ù. ÀÌ°ÍÀº sÀÇ ¹®ÀÚ¿­ ±æÀÌÀ̰ųª countÀÌ´Ù. 2.20 etc functions ³ª¸ÓÁö ¸î°³¸¦ »ìÆ캸ÀÚ. À̰͵µ ÀÌÀüÀÇ memset°ú °ÅÀÇ °°´Ù. ±×·¯¸é¼­µµ Á¶±Ý¾¿ ´Ù¸£°Ô ÀÛµ¿ÇÏ´Â ÇÔ¼ö°¡ ¿©·¯°³ÀÌ´Ù. ----------------------------------------------------------------------- /* * This looks horribly ugly, but the compiler can optimize it totally, * as we by now know that both pattern and count is constant.. */ extern inline void * __constant_c_and_count_memset(void * s, \ unsigned long pattern, size_t count) { switch (count) { case 0: return s; case 1: *(unsigned char *)s = pattern; return s; case 2: *(unsigned short *)s = pattern; return s; case 3: *(unsigned short *)s = pattern; *(2+(unsigned char *)s) = pattern; return s; case 4: *(unsigned long *)s = pattern; return s; } #define COMMON(x) \ __asm__("cld\n\t" \ "rep ; stosl" \ x \ : /* no outputs */ \ : "a" (pattern),"c" (count/4),"D" ((long) s) \ : "cx","di","memory") switch (count % 4) { case 0: COMMON(""); return s; case 1: COMMON("\n\tstosb"); return s; case 2: COMMON("\n\tstosw"); return s; case 3: COMMON("\n\tstosw\n\tstosb"); return s; } #undef COMMON } ----------------------------------------------------------------------- eax¿¡ patternÀ» ³Ö°í, ecx¿¡ count/4¸¦ ³Ö°í, edi¿¡ s¸¦ ³Ö´Â´Ù. ±×´ÙÀ½ count°¡ ÀûÀ» °æ¿ì¿¡´Â ±×³É ¹Ù·Î s¿¡ Á¢±ÙÇÏ¿© count ÀÇ Å©±â¿¡ µû¶ó patterns¸¦ Àû°í, Á¶±Ý Ŭ °æ¿ì¿¡´Â define Á¤ÀǸ¦ »ç¿ëÇÏ¿© ¾î¼Àºí ¸® ·çƾÀ¸·Î ó¸®ÇÑ´Ù. cld; rep; stosl; ·Î ecx¿¡ ÀúÀåµÈ Ƚ¼ö¸¸Å­ eax ÀÇ °ªÀ» edi(s)°¡ °¡¸£Å°´Â °÷¿¡ 4¹ÙÀÌÆ®¾¿À» ¾´´Ù. ±×¸®°í count%4ÀÇ °ª ¿¡ µû¶ó ¿©ºÐÀÇ ¹ÙÀÌÆ®¸¦ ¾²°Ô µÈ´Ù. À§¿¡¼­ º»¹Ù¿Í °°´Ù. À̹ø¿¡´Â memscanÀÌ´Ù. À§¿¡¼­ º» memchr°ú °ÅÀÇ ºñ½ÁÇÏ´Ù. --------------------------------------------------------------------- /* * find the first occurrence of byte 'c', or 1 past the area if none */ extern inline void * memscan(void * addr, int c, size_t size) { if (!size) return addr; __asm__("cld repnz; scasb jnz 1f dec %%edi 1: " : "=D" (addr), "=c" (size) : "0" (addr), "1" (size), "a" (c)); return addr; } ----------------------------------------------------------------------- inputÀº edi¿¡ addrÀ» , ecx¿¡ size¸¦ , eax¿¡ ãÀ» °ªÀÎ c¸¦ Àü´ÞÇÑ´Ù. outputÀº edi¸¦ ÅëÇÏ¿© addr·Î °ªÀ» Àü´ÞÇÏ°í, ecx¸¦ ÅëÇÏ¿© size¿¡ °ªÀ» Àü´ÞÇÑ´Ù. ¸ÕÀú size°¡ 0À̸é addrÀ» ±×³É ¸®ÅÏÇÑ´Ù. cld; repnz; scasb; ·Î al(cÀÇ ÇÏÀ§1¹ÙÀÌÆ®)ÀÇ °ª°ú edi(addr)ÀÌ °¡¸£Å°´Â °÷ÀÇ °ªÀÌ °°Àº Áö¸¦ ¹ÙÀÌÆ® ´ÜÀ§·Î ecx(size) ¹ø °Ë»çÇÏ¿© ÇÑ´Ù. ã¾Ò´Ù¸é dec %%edi·Î edi¸¦ Çϳª °¨¼Ò½ÃÄѼ­ ãÀº À§Ä¡¸¦ addr·Î Àü´ÞÇÏ°í ¸øã¾Ò´Ù¸é ÇöÀç º° ÀÇ¹Ì ¾ø´Â °÷À» °¡¸£Å°°í ÀÖ´Â edi¸¦ ±×´ë·Î addr·Î Àü ´ÞÇÑ´Ù. ( ÇÏÀÌÅÚÀÌ 500¶óÀÎÀÌ ÇÑ°è¶ó¼­ ºÎµæÀÌ ´ÙÀ½ °Ô½Ã¹°·Î ³ª¸ÓÁö¸¦ Àû´Â´Ù.) ¾î½º¸§ÀÌ Áú³á¿¡ ddoch Çѵ¿ÈÆ µå¸² Ãâ·ÂÀÌ ³¡³µ½À´Ï´Ù. [Enter]¸¦ ´©¸£½Ê½Ã¿À. Nownuri ¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡ LINUX ¸®´ª½º Çдç-¸®´ª½º °­Á / ¿¬Àç 1/¸¶Áö¸· ¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡ (LT : ¾î¼À) ¹øÈ£ ¿Ã¸°ID ÀÌ ¸§ ³¯ Â¥ ÀÐÀ½ ÂÊ Á¦ ¸ñ ------------------------------------------------------------------------------ 751 hetta À̱âõ 07/05 317 26 [°­ÁÂ] C¿Í ¾î¼Àºí¸®ÄÚµå (1) 406 ddoch Çѵ¿¿í 02/20 1574 19 [°­ÁÂ06] ÀζóÀÎ ¾î¼Àºí¸®¸¦ ºÐ¼®ÇÏÀÚ! 405 ddoch Çѵ¿¿í 02/20 1425 32 [°­ÁÂ05] ÀζóÀÎ ¾î¼Àºí¸®¸¦ ºÐ¼®ÇÏÀÚ! 404 ddoch Çѵ¿¿í 02/19 1429 30 [°­ÁÂ04] ÀζóÀÎ ¾î¼Àºí¸®¸¦ ºÐ¼®ÇÏÀÚ! 403 ddoch Çѵ¿¿í 02/19 1440 28 [°­ÁÂ03] ÀζóÀÎ ¾î¼Àºí¸®¸¦ ºÐ¼®ÇÏÀÚ! 402 ddoch Çѵ¿¿í 02/19 1902 21 [°­ÁÂ02] ÀζóÀÎ ¾î¼Àºí¸®¸¦ ºÐ¼®ÇÏÀÚ! 400 ddoch Çѵ¿¿í 02/18 2702 31 [°­ÁÂ01] ÀζóÀÎ ¾î¼Àºí¸®¸¦ ºÐ¼®ÇÏÀÚ! ¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡ ¸í·É¾î¾È³»(C) µµ¿ò¸»(H) ÃʱâÈ­¸é(T) À̵¿(GO,P,A,N,B) ù°Ô½Ã¹°(L) Á¾·á(X) ¼±ÅÃ> pr 406 PRINTER/CAPTURE °¡ ÁغñµÇ¾ú½À´Ï±î(Y/n) ? ¡º¸®´ª½º Çдç-¸®´ª½º °­Á / ¿¬Àç (go LINUX)¡» 406¹ø Á¦ ¸ñ:[°­ÁÂ06] ÀζóÀÎ ¾î¼Àºí¸®¸¦ ºÐ¼®ÇÏÀÚ! ³¡ ¿Ã¸°ÀÌ:ddoch (Çѵ¿¿í ) 97/02/20 19:29 ÀÐÀ½:1574 °ü·ÃÀÚ·á ¾øÀ½ ----------------------------------------------------------------------------- 3. µ¡ºÙÀÌ´Â ¸» ÀÌÁ¦ ºÐ¼®ÇÒ string.h¿¡ ´õÀÌ»ó ÀζóÀÎ ¾î¼Àºí¸®°¡ ¾ø´Ù. Ȥ½Ã ÀDZ¸½ÉÀÌ ³ª´Â ºÎºÐÀÌ ÀÖÀ¸¸é ±× ºÎºÐ¸¸ µû·Î ¶¼¾î ³»¾î¼­ ÇÔ¼öÀ̸§À» ÀûÀýÈ÷ ¹Ù²Ù¾î¼­ Å×½º Æ®¸¦ ÇØ º¼ ¼öµµ ÀÖ´Ù. ¾Æ¿ï·¯ ÀÛ¼ºÇÑ ÀζóÀÎ ¾î¼Àºí¸®°¡ Æ÷ÇÔµÈ ¼Ò½º¸¦ ÄÄ ÆÄÀÏ ÇÒ Àû¿¡ gcc -S my_memcpy.c ¿Í °°ÀÌ ÇÏ¿© ¼ø¼ö ¾î¼Àºí¸® ·çƾ¸¸À» ±¸ ÇÒ ¼ö µµ ÀÖ´Ù. Á¶±ÝÀº ¿¹¿ÜÁö¸¸ ¼³¸íÇÏÁö ¾ÊÀº °Í Áß¿¡ define µÈ °ÍÀ» »ìÆ캸ÀÚ. ----------------------------------------------------------------------- /* 1 */ #define memcpy(t, f, n) \ (__builtin_constant_p(n) ? \ __constant_memcpy((t),(f),(n)) : \ __memcpy((t),(f),(n))) #define memcmp __builtin_memcmp /* 2 */ #define __constant_count_memset(s,c,count) \ __memset_generic((s),(c),(count)) /* 3 */ #define __constant_c_x_memset(s, c, count) \ (__builtin_constant_p(count) ? \ __constant_c_and_count_memset((s),(c),(count)) : \ __constant_c_memset((s),(c),(count))) /* 4 */ #define __memset(s, c, count) \ (__builtin_constant_p(count) ? \ __constant_count_memset((s),(c),(count)) : \ __memset_generic((s),(c),(count))) /* 5 */ #define memset(s, c, count) \ (__builtin_constant_p(c) ? \ __constant_c_x_memset((s),(0x01010101UL*(unsigned char)c),(count)) : \ __memset((s),(c),(count))) ------------------------------------------------------------------------ ¸î°¡Áö ¸ÅÅ©·Î¸¦ Á¤ÀÇÇÏ°í ÀÖ´Â µ¥, ¸ðµÎ´Ù __builtin_constant_p()¶ó´Â °Í ¿¡ ÀÇÁ¸ÇÏ°í ÀÖ´Ù. Ä¿³Î¼Ò½º³ª Çì´õÆÄÀÏ¿¡´Â ¾Æ¹«¸® ã¾ÆºÁµµ ÀÌ·± Á¤Àdzª ¼±¾ðÀÌ Á¸ÀçÇÏÁö ¾Ê´Â´Ù. ¶Ç ÀÌ°ÍÀº ´Ù¸¥ ¸¹Àº Ä¿³Î ¼Ò½º¼Ó¿¡¼­µµ ³ªÅ¸³ª°í ÀÖ´Ù. ÄÄÆÄÀÏ·¯ ¼Ò½º³ª, libc¼Ó¿¡ ÀÖÀ» ¹ýµµ Çѵ¥ ¾Æ¹¸´ø ùºÎºÐÀÇ ¸ÞÅ©·Î Á¤ÀÇ(1)¿¡¼­´Â memcpy¸¦ È£ÃâÇϸé __builtin_constant_p(n)ÀÌ 0À̸é __memcpy (µÚ¿¡ ³ª¿Ã ¸ÅÅ©·Î)°¡ È£ÃâµÇ°í ¾Æ´Ï¸é __constant_memcpy°¡ È£Ã⠵ȴÙ. ÀüÀÚ´Â 4¹ÙÀÌÆ®´ÜÀ§±âº»º¹»ç¿Í 1-3ÀÇ ³ª¸ÓÁö º¹»ç¸¦ ÇÏ´Â ¼ø¼ö ÀζóÀÎ ¾î¼Àºí¸®·çƾÀÌ°í, ÈÄÀÚ´Â ¾ÕÀü¿¡ º¸¾Ò´ø switch ¹®°ú ÀζóÀÎ ¾î¼ÀÀ» È¥¿ëÇÑ ·çƾÀÌ´Ù. (3)¸¦ º¸¸é, __constant_c_x_memsetÀ» È£ÃâÇϸé __builtin_constant_p(count)ÀÇ °ª¿¡ µû ¶ó¼­ 0À̸é __constant_c_memset(4¹ÙÀÌÆ®´ÜÀ§º¹»ç ÀζóÀξî¼À·çƾ)ÀÌ »ç¿ëµÇ °í ¾Æ´Ï¸é __constant_c_and_count_memset(switch¿Í ÀζóÀÎÀ» È¥¿ëÇÑ ·çƾ) ÀÌ »ç¿ëµÈ´Ù. (4)À» º¸¸é, __memsetÀ» È£ÃâµÇ¸é __builtin_constant_p(count)ÀÇ °ª¿¡ µû¶ó¼­ 0À̸é __memset_genericÀÌ »ç¿ëµÇ°í, ¾Æ´Ï¸é __constant_count_memsetÀÌ »ç¿ëµÈ´Ù. (2)ÀÇ ¸ÅÅ©·Î Á¤ÀÇ·Î ÀÎÇØ __memset_genericÀº __constant_count_memset¿¡ ´ëÇÑ ¸ÅÅ©·Î·Î °°´Ù. (5)¸¦ º¸¸é, memsetÀ» È£ÃâÇϸé __builtin_constant_p(c)ÀÇ °ª¿¡ µû¶ó¼­ 0À̸é __memset ÀÌ ºÒ¸®¿öÁö°í ¾Æ´Ï¸é __constant_c_x_memset((s), (0x01010101UL*(unsigned char)c), (count)); ·Î ºÒ¸®¿öÁø´Ù. ÈÄÀÚ´Â ¶Ç´Ù½Ã (3) ¿¡ ³ª¿À´Â ¸ÅÅ©·ÎÀÌ´Ù. ¸ÅÅ©·Î¸¦ Á¦¿ÜÇÑ memset°ú °ü·ÃµÈ ÇÔ¼ö¸¸ Á¤¸®ÇÏÀÚ. __memset_generic : 1¹ÙÀÌÆ®¾¿ º¹»ç ÀζóÀÎ ¾î¼À __constant_c_memset : 4¹ÙÀÌÆ®¾¿ º¹»ç ÀζóÀÎ ¾î¼À __constant_c_and_count_memset : switch¿Í 4¹ÙÀÌÆ® º¹»ç ¾î¼À È¥¿ë 4. ³ª¿À´Â ¸» ¿©±â±îÁö ´Ù º¸½ÅºÐ¿¡°Ô ¹Ú¼ö¸¦ º¸³»µå¸®°í ½Í´Ù. ÀÌÁ¦ AT&T¹®¹ýÀÇ ÀζóÀÎ ¾î¼À¿¡´Â ¾î´ÀÁ¤µµ ¾Æ½Ç °ÍÀÌ¸ç ¿©·¯ºÐµéÀÇ ÇÁ·Î±×·¥¿¡ ÇÊ¿äÇÑ ¸¸Å­ Àζó ÀÎ ¾î¼ÀÀ» »ç¿ëÇÏ½Ç ¼öµµ ÀÖÀ» °ÍÀÌ´Ù. Ä¿³Î ¼Ò½º¸¦ º»°ÝÀûÀ¸·Î ºÐ¼®ÇÏÀÚ¸é AT&T ¹®¹ý¿¡ ±â¹ÝÇÑ ¾î¼Àºí¸®´Â ÇʼöÀûÀ¸·Î ¾Ë¾Æ¾ß ÇÑ´Ù. ±×·¸Áö ¾Ê´Ù ÇÏ´õ ¶óµµ ºü¸¥ ¼ÓµµÃ³¸®¸¦ ¿äÇÏ´Â °÷¿¡´Â Çѹø Âë »ç¿ëÇØ º¼¸¸ÇÏ´Ù. ÈÞ.. ¸¶Áö¸·À¸·Î ¸Þ¸ð¸® Á¢±Ù°ú °ü·ÃµÈ º¥Ä¡¸¶Å© ÇÁ·Î±×·¥À» ¾Æ·¡¿¡ ½Æ°Ú´Ù. 1¹ÙÀÌÆ®,4¹ÙÀÌÆ® ´ÜÀ§·Î º¹»ç¸¦ Çϰųª memsetÀ» ÇÏ´Â ÀζóÀÎ ¾î¼Àºí ¸® ·çƾµéÀÌ´Ù. string.h ÀÇ Á¦ÀÏ Ã¹ºÎºÐ¿¡ Åä¹ßÁîÀÇ ¾ð±ÞÀÌ ÀÖ±ä ÇÏÁö¸¸ °ú¿¬ ¾î´À°ÍÀÌ ´õ ºü¸¦ °ÍÀΰ¡? ¿©·¯ºÐÀÇ ½Ã½ºÅÛ¿¡¼­µµ Çѹø ½ÇÇàÇغ¸±â ¹Ù¶õ ´Ù. ±×·³, ´ÙÀ½ ±âȸ¿¡ ¶Ç ¸¸³¯ °ÍÀ» ¾à¼ÓÇϸç.... ¶ÇÄ¡ Çѵ¿ÈÆ ddoch@hitel.kol.co.kr ddoch@nownuri.nowcom.co.kr /* benchmark.c -- memory access speed benchmark test program * between 1 byte copying and 4 byte copying, and * measuring 1/100 second. * * My system is 486DX4-100, gcc 2.7.2. Follows is the result. * I've been to compile 'gcc -O2 benchmark.c. * * asm memset (byte): 198 (1/100 second) * asm memset (long): 48 (1/100 second) * libc memset : 48 (1/100 second) * * asm memcpy (byte): 341 (1/100 second) * asm memcpy (long): 190 (1/100 second) * libc memcpy : 190 (1/100 second) * * by ddoch 1997.2.20 e-mail ddoch@hitel.kol.co.kr */ #include #include #include #include #define MEMORY_ALLOC_SIZE (1024*1024) #define TEST_NUMBERS (10) inline void * byte_memset(void * s, char c, size_t count) { __asm__ __volatile__( "cld\n\t" "rep\n\t" "stosb" : /* no output */ :"a" (c),"D" (s),"c" (count) :"cx","di","memory"); return s; } inline void * long_memset(void * s, unsigned long c, size_t count) { __asm__ __volatile__( "cld\n\t" "rep ; stosl\n\t" "testb $2,%b1\n\t" "je 1f\n\t" "stosw\n" "1:\ttestb $1,%b1\n\t" "je 2f\n\t" "stosb\n" "2:" : /* no output */ :"a" (c), "q" (count), "c" (count/4), "D" ((long) s) :"cx","di","memory"); return (s); } inline void * byte_memcpy(void * to, const void * from, size_t n) { __asm__ __volatile__( "cld\n\t" "rep; movsb\n\t" : /* no output */ : "c" (n), "S" ((long)from), "D" ((long)to) : "cx", "si", "di"); return (to); } inline void * long_memcpy(void * to, const void * from, size_t n) { __asm__ __volatile__( "cld\n\t" "rep ; movsl\n\t" "testb $2,%b1\n\t" "je 1f\n\t" "movsw\n" "1:\ttestb $1,%b1\n\t" "je 2f\n\t" "movsb\n" "2:" : /* no output */ :"c" (n/4), "q" (n),"D" ((long) to),"S" ((long) from) : "cx","di","si","memory"); return (to); } void main() { void *src, *dest; clock_t c1, c2; int i; /* memory allocation */ src = (void *) malloc(MEMORY_ALLOC_SIZE); if (src == (void *)0) { fprintf(stderr, "Memory allocation error!!\n"); fprintf(stderr, "Be decreased allocation memory size\n\n"); exit(1); } dest = (void *) malloc(MEMORY_ALLOC_SIZE); if (dest == (void *)0) { fprintf(stderr, "memory allocation error!!\n"); fprintf(stderr, "Be decreased allocation memory size\n\n"); exit(1); } /* memset test */ printf("\nmemset testing...\n\n"); /* memset byte assembly */ c1 = clock(); for (i = 0; i < TEST_NUMBERS; i++) { byte_memset(src, 0, MEMORY_ALLOC_SIZE); } c2 = clock(); printf("asm memset (byte): %d (1/100 second)\n\n", c2-c1); /* memset long assembly */ c1 = clock(); for (i = 0; i < TEST_NUMBERS; i++) { long_memset(src, 0, MEMORY_ALLOC_SIZE); } c2 = clock(); printf("asm memset (long): %d (1/100 second)\n\n", c2-c1); /* memset in libc */ c1 = clock(); for (i = 0; i < TEST_NUMBERS; i++) { memset(src, 0, MEMORY_ALLOC_SIZE); } c2 = clock(); printf("libc memset: %d (1/100 second)\n\n", c2-c1); /* memcpy test */ printf("\nmemcpy testing...\n\n"); /* memcpy byte assembly */ c1 = clock(); for (i = 0; i < TEST_NUMBERS; i++) { byte_memcpy(dest, src, MEMORY_ALLOC_SIZE); } c2 = clock(); printf("asm memcpy (byte): %d (1/100 second)\n\n", c2-c1); /* memcpy long assembly */ c1 = clock(); for (i = 0; i < TEST_NUMBERS; i++) { long_memcpy(dest, src, MEMORY_ALLOC_SIZE); } c2 = clock(); printf("asm memcpy (long): %d (1/100 second)\n\n", c2-c1); /* memcpy in libc */ c1 = clock(); for (i = 0; i < TEST_NUMBERS; i++) { memcpy(dest, src, MEMORY_ALLOC_SIZE); } c2 = clock(); printf("libc memcpy: %d (1/100 second)\n\n", c2-c1); free(src); free(dest); } Ãâ·ÂÀÌ ³¡³µ½À´Ï´Ù. [Enter]¸¦ ´©¸£½Ê½Ã¿À. Nownuri ¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡ LINUX ¸®´ª½º Çдç-¸®´ª½º °­Á / ¿¬Àç 1/¸¶Áö¸· ¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡ (LT : ¾î¼À) ¹øÈ£ ¿Ã¸°ID ÀÌ ¸§ ³¯ Â¥ ÀÐÀ½ ÂÊ Á¦ ¸ñ ------------------------------------------------------------------------------ 751 hetta À̱âõ 07/05 317 26 [°­ÁÂ] C¿Í ¾î¼Àºí¸®ÄÚµå (1) 406 ddoch Çѵ¿¿í 02/20 1575 19 [°­ÁÂ06] ÀζóÀÎ ¾î¼Àºí¸®¸¦ ºÐ¼®ÇÏÀÚ! 405 ddoch Çѵ¿¿í 02/20 1425 32 [°­ÁÂ05] ÀζóÀÎ ¾î¼Àºí¸®¸¦ ºÐ¼®ÇÏÀÚ! 404 ddoch Çѵ¿¿í 02/19 1429 30 [°­ÁÂ04] ÀζóÀÎ ¾î¼Àºí¸®¸¦ ºÐ¼®ÇÏÀÚ! 403 ddoch Çѵ¿¿í 02/19 1440 28 [°­ÁÂ03] ÀζóÀÎ ¾î¼Àºí¸®¸¦ ºÐ¼®ÇÏÀÚ! 402 ddoch Çѵ¿¿í 02/19 1902 21 [°­ÁÂ02] ÀζóÀÎ ¾î¼Àºí¸®¸¦ ºÐ¼®ÇÏÀÚ! 400 ddoch Çѵ¿¿í 02/18 2702 31 [°­ÁÂ01] ÀζóÀÎ ¾î¼Àºí¸®¸¦ ºÐ¼®ÇÏÀÚ! ¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡ ¸í·É¾î¾È³»(C) µµ¿ò¸»(H) ÃʱâÈ­¸é(T) À̵¿(GO,P,A,N,B) ù°Ô½Ã¹°(L) Á¾·á(X) ¼±ÅÃ>