Á¦ ¸ñ:[°­ÁÂ] ÀζóÀÎ ¾î¼Àºí¸®¸¦ ºÐ¼®ÇÏÀÚ. (1) °ü·ÃÀÚ·á:¾øÀ½ [564] º¸³½ÀÌ:Çѵ¿ÈÆ (ddoch ) 1997-02-18 21:57 Á¶È¸:1650 --------------------------------------------------------------- °­Á : ÀζóÀÎ ¾î¼Àºí¸®¸¦ ºÐ¼®ÇÏÀÚ. --------------------------------------------------------------- -- ºÎÁ¦ : /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 Çѵ¿ÈÆ