============================================================================ [Âü°í]Çѵ¿ÈÆÇÊÀÚÀÇ ±Û ³ª´Â µÎ´Þµ¿¾È À̹®¼­¸¦ ²ôÀû°Å·Á¿Ô´Â µ¥ ³Ê¹« ¿À·§µ¿¾È ÁúÁú²ô´Â °Í °°Àº ±âºÐÀÌ µé¾î¼­ ÀÌÁ¦´Â Á» ±Û ¾µ ±âºÐµµ µé°íÇؼ­ ÀÌ·¸°Ô ÀÌ ¹®¼­¸¦ ³»³õ°Ô µÇ¾ú´Ù. À̹®¼­´Â DJGPP¸¦ »ç¿ëÇؼ­ ¾î¼Àºí¸®Äڵ带 ÀÛ¼ºÇÏ´Â µ¥¿¡ ´ëÇØ Âª°Ô ¾ð±ÞÀÌ µÇ¾î ÀÖ´Ù. ³ª´Â ÀÏÀÏÀÌ x86 ¾î¼Àºí¸® Äڵ带 ¾î¶»°Ô ÀÛ¼ºÇÏ´Â Áö ÀÏÀÏÀÌ ¸» ÇÏÁö ¾ÊÀ» °ÍÀÌ´Ù. (´Ù¸¥ ±³º»À̳ª Ã¥À» º¸´Â °Ô ÁÁÀ» °ÍÀÌ´Ù. ). ³»°¡ ¾Æ´Â Çѵµ³»¿¡¼­´Â DJGPP¿¡¼­ÀÇ ÀζóÀÎ ¾î¼Àºí¸®¿Í ¿ÜºÎ ¾î¼Àºí¸®¸¦ ¾î¶»°Ô »ç¿ëÇÏ´Â Áö º¸¿©ÁÖµµ·Ï ÇÏ°Ú´Ù. ¾Æ¸¶µµ À̱ÛÀ» º¸´Â ºÐÀ̸é TASM, MASM µîÀ» »ç¿ëÇغ¸¾Ò°Å³ª, "Ç¥ÁØ"ÀÎÅÚ ¾î¼Àºí¸®¿¡ ´ëÇØ ¾î´ÀÁ¤µµ Ä£¼÷Çϸ®¶ó°í »ý°¢ÇÑ´Ù. ³»»ý°¢¿£ ¸ÕÀú ¿Â¶óÀÎ ¹®¼­ÀÎ txi*.zip ÆÐÅ°Áö ¾È¿¡ µé¾îÀÖ´Â faq102.zip °ú faq201b.zip °ú °°Àº FAQ¸¦ º¸±â¸¦ ±ÇÇÑ´Ù. ÀÌ ¹®¼­µéÀº ¶ÇÇÑ comp.os.msdos.djgpp ´º½º±×·ì¿¡µµ ÀÖ´Ù. ÁÖ¿ä »çÀÌÆ®´Â DJGPP ȨÆäÀÌÁö¶ó°í º¼ ¼ö Àִµ¥, ÃÖ±ÙÀÇ ¾÷µ¥ÀÌÆ® µÈ Á¤º¸µéÀº DJGPP³ª mail archives ¿¡¼­ ±¸ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÇÊÀÚ´Â mail archives¿¡¼­ ¸¹Àº Áß¿äÇÑ ±â»çµéÀ» ã¾Æ º¼ ¼ö ÀÖ¾ú´Ù. ---------------------------------------------------------------------------- AT&T x86 ¾î¼Àºí¸® ¹®¹ý ====================== DJGPP´Â AT&T ¾î¼Àºí¸® ¹®¹ýÀ» »ç¿ëÇÑ´Ù. DJGPPÀÇ ¾î¼Àºí¸® ¹®¹ýÀº ÀÎÅÚ ¹®¹ý°ú ¸¹Àº ¼¼¼¼ÇÑ Â÷ÀÌÁ¡ÀÌ ÀÖ´Ù. Áß¿äÇÑ Â÷ÀÌÁ¡µéÀº : ------------------- * AT&T ¹®¹ýÀº ¿øõ/¸ñÀûÁö ÇÇ¿¬»êÀÚµéÀ» ¿ªÀ¸·Î ¹èÄ¡ÇÏ´Â µ¥, ¿øõÁö ´ÙÀ½ ¿¡ ¸ñÀûÁö°¡ µû¶ó¿Â´Ù. * ·¹Áö½ºÅÍ ÇÇ¿¬»êÀÚ µéÀº "%"¸¦ ¾Õ¿¡ ºÙÀδÙ. * »ó¼ö¾Õ¿¡´Â "$"¸¦ ºÙÀδÙ. * ¸Þ¸ð¸® ÇÇ¿¬»êÀÚµéÀÇ Å©±â´Â opcodeÀÇ ³¡±ÛÀڷΠǥÇöµÈ´Ù. "b" (8-bit), "w" (16-bit), "l" (32-bit) ÀÎÅÚ¹®¹ý°ú ÇÔ²² ¸î°¡Áö ¿¹¸¦ µé°Ú´Ù. movw %bx, %ax (mov ax, bx) xorl %eax, %eax (xor eax, eax) movw $1, %ax (mov ax,1) movb X, %ah (mov ah, byte ptr X) movw X, %ax (mov ax, word ptr X) movl X, %eax (mov eax, X) ´ëºÎºÐÀÇ opcodeµéÀº AT&T¿Í ÀÎÅÚ Æ÷¸äÀ¸·Î ½Äº°µÈ´Ù. ¸î°³¸¦ Á¦¿ÜÇÏ°í´Â: movsSD (movsx) movzSD (movzx) S¿Í D´Â °¢°¢ ¿øõ/¸ñÀû ÇÇ¿¬»êÀÚÀÇ Å©±â¿¡ µû¸¥ Á¢¹Ì»çÀÌ´Ù. ¿¹¸¦ µé¸é "movswl %ax, %ecx (movsx ecx, ax)". cbtw (cbw) cwtl (cwde) cwtd (cwd) cltd (cdq) lcall $S,$O (call far S:O) ljmp $S,$O (jump far S:O) lret $V (ret far V) [ÁÖÀÇ!] opcode Á¢µÎ»çµéÀº °°Àº ¶óÀο¡ ¾²Áö ¸»¾Æ¾ß ÇÑ´Ù. ¿¹¸¦ µé¸é, "rep"°ú "stosd"´Â µÎ°³ÀÇ ¸í·ÉÀ¸·Î ºÐ¸®µÇ¾î¾ß ÇÑ´Ù. ´Ù¸¥ °æ¿ì´Â ³ªÁß¿¡ ¼³¸íÇÏ°Ú´Ù. ¸Þ¸ð¸® ÂüÁ¶ÇÏ´Â ¹æ¹ýµµ Á¶±ÝÀÇ Â÷ÀÌ°¡ ÀÖ´Ù. ÀϹÝÀûÀ¸·Î ÀÎÅÚ¿¡¼­ ¸Þ¸ð¸®¸¦ ÂüÁ¶ÇÏ´Â Çü½ÄÀº ´ÙÀ½°ú °°´Ù. ¿µ¿ª: [BASE + INDEX*SCALE + DISP] ÀÌ°ÍÀº ´ÙÀ½°ú °°ÀÌ ¾²¿©Áø´Ù. ¿µ¿ª:DISP(BASE, INDEX, SCALE). ¿¹¸¦ ¸î °³ µé°Ú´Ù. movl 4(%ebp), %eax (mov eax, [ebp+4]) addl (%eax,%eax,4), %ecx (add ecx, [eax + eax*4]) movb $4, %fs:(%eax) (mov fs:eax, 4) movl _array(,%eax,4), %eax (mov eax, [4*eax + array]) movw _array(%ebx,%eax,4), %cx (mov cx, [ebx + 4*eax + array]) jump ¸í·ÉÀº Ç×»ó ÀûÀº ÆøÀÇ À̵¿À¸·Î »ç¿ëµÈ´Ù. µû¶ó¿À´Â ¸í·ÉµéÀº Ç×»ó ¹ÙÀÌÆ® À§Ä¡À̵¿¾È¿¡¼­¸¸ ÀÛµ¿ÇÑ´Ù. "jcxz", "jecxz", "loop", "loopz", "loope", "loopnz", "loopne"µéÀº ±×·¸Áö ¾Ê´Ù. ¿Â¶óÀÎ ¹®¼­µé¿¡¼­ Á¦¾ÈÇÑ °Íó·³ "jcxz foo"´Â ´ÙÀ½°ú °°ÀÌ ¾µ ¼ö ÀÖ´Ù. jcxz cx_zero jmp cx_nonzero cx_zero: jmp foo cx_nonzero: [ÁÖÀÇ!] "mul", "imul"¸í·Éµéµµ Á¶½ÉÇؼ­ »ç¿ëÇØ¾ß ÇÑ´Ù. ´ÙÁßÀ¸·Î È®ÀåµÇ´Â ¸í·ÉµéÀº ÇϳªÀÇ ÇÇ¿¬»êÀÚ¸¦ »ç¿ëÇÑ´Ù. ¿¹¸¦ µé¸é, "imul $ebx, $ebx" ´Â ±× ¿¬»ê°á°ú¸¦ "edx:eax"·Î Ãâ·ÂÇÏÁö ¾ÊÀ» °ÍÀÌ´Ù. È®ÀåµÈ °á°ú¸¦ ¾òÀ»·Á¸é "imul %ebx"ó·³ ÇϳªÀÇ ÇÇ¿¬»êÀÚ¸¦ »ç¿ëÇÏÀÚ. ---------------------------------------------------------------------------- ÀζóÀÎ ¾î¼Àºí¸® =================== ÀζóÀÎ ¾î¼Àºí¸® ºÎÅÍ ¸ÕÀú ¼³¸íÇÏ°Ú´Ù. ¿©±â¿¡ °üÇؼ­ ÀÚÁÖ Áú¹®ÇÏ´Â ÇÏ´Â °ÍÀ» º¸±â ¶§¹®ÀÌ´Ù. ÀÌ°ÍÀº ±âº» ¹®¹ýÀÌ´Ù. ¿Â¶óÀÎ help¿¡¼­À̾߱âÇÑ °Í ó·³: __asm__(asm statements : outputs : inputs : registers-modified); 4°³ÀÇ Çʵå´Â: * asm statements - ´º¶óÀÎÀ¸·Î ±¸ºÐµÇ´Â AT&T Çü½Ä * outputs - ','¿¡ ÀÇÇؼ­ ±¸ºÐµÇ°í °ýÈ£¾ÈÀÇ À̸§ÀÌ µû¸£´Â ±ÔÁ¤¹® * inputs - ','¿¡ ÀÇÇؼ­ ±¸ºÐµÇ°í °ýÈ£¾ÈÀÇ À̸§ÀÌ µû¸£´Â ±ÔÁ¤¹® * registers-modified - ','¿¡ ÀÇÇؼ­ ±¸ºÐµÇ´Â À̸§µé °£´ÜÇÑ ¿¹¸¦ µéÀÚ: __asm__(" pushl %eax\n movl $1, %eax\n popl %eax" ); [ÁÖÀÇ!] ¿©·¯ºÐµéÀº ¸Å¹ø ´Ù¸¥ ¼¼°³ÀÇ Çʵ嵵 ÀÏÀÏÀÌ ¸í½ÃÇØÁÙ ÇÊ¿ä´Â ¾ø´Ù. input/output °ªµéÀ» ¾µ ÇÊ¿ä°¡ ¾ø°í ´Ù¸¥ ·¹Áö½ºÅ͸¦ °Ç´õ¸± ÇÊ¿ä°¡ ¾ø´Ù¸é. ÀԷºκÐÀ» Ãß°¡Çغ¸ÀÚ. int i = 0; __asm__(" pushl %%eax\n movl %0, %%eax\n addl $1, %%eax\n movl %%eax, %0\n popl %%eax" : : "g" (i) ); /* i++; */ óÀ½ºÎÅÍ Â÷±ÙÂ÷±Ù ¼³¸í¸é, ¿ì¸®ÀÇ ÀԷ°ªÀº "i" ÀÌ°í 1¸¸Å­ Áõ°¡Çϱ⸦ ¹Ù¶õ´Ù°í °¡Á¤Çغ¸ÀÚ. Ãâ·Â°ªÀº ¾Æ¹«°Íµµ ¾ø´Â »óÅÂÀÌ´Ù. ·¹Áö½ºÅ͸¦ µ¤¾î¾²Áöµµ ¾Ê´Â´Ù (¸ÕÀú "eax"¸¦ ÀúÀåÀ» ÇßÀ¸¹Ç·Î). ±×·¡¼­ µÎ¹ø°¿Í ¸¶Áö¸· Çʵå´Â ºñ¾îÀÖ´Ù. [ÁÖÀÇ!] ÀÔ·ÂÇʵå¿Ü¿¡ ´Ù¸¥ Çʵ带 »ç¿ëÇÏÁö ¾Ê´Â ´Ù¸é, Ãâ·ÂÇʵå´Â °ø¹é ÄÝ·ÐÀ¸·Î µÎ¾î¾ß ÇÏ°í, ¸¶Áö¸· Çʵå´Â ±×³É µÎ¾îµµ µÈ´Ù. µÎ°³ÀÇ ÄݷлçÀÌ ¿¡´Â Àû¾îµµ ÇϳªÀÇ ´º¶óÀι®ÀÚ³ª ÇϳªÀÇ °ø¹é¹®ÀÚ´Â µÎ¾î¾ß ÇÑ´Ù. ÀÔ·ÂÇʵå·Î ³Ñ¾î°¡ º¸ÀÚ. ±ÔÁ¤¹®(constraints)´Â ÄÄÆÄÀÏ·¯¿¡°Ô °ªÀ» ³Ñ°ÜÁÖ¾î ´Ù·çµµ·Ï ÇÏ´Â ¸í·ÉÀÌ´Ù. Å«µû¿ÈÇ¥·Î µÑ·¯ÃÄ¾ß ÇÔÀº ´ç¿¬ÇÏ´Ù. ±×·¸´Ù¸é "g"´Â ¹«¾ùÀ» ¶æÇϴ°¡? "g"´Â "i"¼ÓÀÇ °ªÀ» ¾îµð·Î ºÒ·¯¿ÃÁö¸¦ ÄÄÆÄÀÏ·¯°¡ °áÁ¤ Çϵµ·Ï ÇÏ´Â °ÍÀÌ´Ù (¾î¼Àºí¸® ¸í·É¾î°¡ Çã¿ëÇÏ´Â Çѵµ³»¿¡¼­). ÀϹÝÀûÀ¸·Î ¿©·¯ºÐµéÀÇ ÀԷº¯¼ö·Î "g"¸¦ »ç¿ëÇÏ¿© ÄÄÆÄÀÏ·¯°¡ ±× °ªµéÀ» ¾îµð·Î ÃëÇÒÁö¸¦ °áÁ¤Çϵµ·Ï ÇÒ ¼ö ÀÖ´Ù(gcc´Â ±×°ÍÀ» ÃÖÀûÈ­ÇÑ´Ù). ¶Ç ¹ü¿ëÀûÀ¸·Î »ç¿ëµÇ´Â °ÍÀ¸·Î "r"ÀÌ ÀÖ´Â µ¥ ÀÌ°ÍÀº ÇöÀç »ç¿ë°¡´ÉÇÑ ¾Æ¹« ·¹Áö½ºÅÍ·Î ·ÎµùÇÏ´Â °ÍÀ» ÀǹÌÇÑ´Ù. "r"¿¡ »ç¿ëµÇ´Â ·¹Áö½ºÅÍ´Â ´ÙÀ½ÁßÀÇ ÇϳªÀÌ´Ù. "a" (ax/eax), "b" (bx/ebx), "c" (cx/ecx), "d" (dx/edx), "D" (di/edi), "S" (si/esi), etc. ÇϳªÀÇ ÀÔ·ÂÀº ¾î¼Àºí¸® ±¸¹®(ù¹ø°Çʵå)¾È¿¡¼­ "%0"À¸·Î ÂüÁ¶µÉ ¼ö ÀÖ´Ù. µÎ°³ÀÇ ÀԷ°ªÀ» »ç¿ëÇß´Ù¸é "%0", "%1"ÀÌ µÉ °ÍÀÌ´Ù. N°³ÀÇ ÀԷ°ªÀÌ ÀÖ°í Ãâ·Â°ªÀÌ ¾ø´Ù¸é "%0"¿¡¼­ "%N-1"ÀÌ ÇØ´ç ÀԷ°ª°ú ÀÏÄ¡µÈ´Ù. [ÁÖÀÇ !] ÀÔ·Â, Ãâ·Â ¶Ç´Â º¯°æµÇ´Â ·¹Áö½ºÅÍ Çʵå Áß ¾î´À°ÍÀÌ¶óµµ »ç¿ë µÈ´Ù¸é, ·¹Áö½ºÅÍ´Â ¾î¼Àºí¸®±¸¹®(ù°Çʵå)¾È¿¡¼­ Çϳª ´ë½Å µÎ°³ÀÇ "%" ¹®ÀÚ°¡ ¾Õ¿¡ ºÙ¿©Á®¾ß ÇÑ´Ù. ù ¿¹Á¦¿¡¼­ÀÇ ±ÔÁ¤¹®Àº ¸¶Áö¸· ¼¼¹ø° ÇÊµå ¿¡¼­´Â »ç¿ëÇÏÁö ¾Ê¾Ò´Ù. µÎ°³ÀÇ ÀÔ·ÂÀ» ÃëÇÏ°í "volatile"Å°¿öµå¸¦ µµÀÔÇغ¸ÀÚ. int i=0, j=1; __asm__ __volatile__(" pushl %%eax\n movl %0, %%eax\n addl %1, %%eax\n movl %%eax, %0\n popl %%eax" : : "g" (i), "g" (j) ); /* i = i + j; */ À̹ø¿¡´Â µÎ°³ÀÇ ÀԷ°ªÀ» ÃëÇß°í ¾Æ¹« ¹®Á¦µµ ¾ø´Ù. ´ÜÁö "%0"Àº ù° ÀÔ·ÂÀÎ "i"¿Í ÀÏÄ¡ÇÏ°í, "%1"Àº "j"¿Í ÀÏÄ¡ÇÏ°í ÀÖ´Ù. [ÁÖÀÇ !] "volatile"Àº ¹«¾ùÀ» ¶æÇÏ´Â °ÍÀϱî? ±×°ÍÀº ´ÜÁö ÄÄÆÄÀÏ·¯°¡ ¾î¼Àºí¸® ±¸¹®µéÀ» ´Ù½Ã Çؼ®ÇÏ°í, ¾ø¾Ö°í, Á¶ÇÕÇÏ´Â °ÍÀ» ¸øÇÏ°Ô ÇÑ´Ù. ±×¸®°í ±×°ÍÀ» ¾î¼ÀºíÇÑ´Ù. (gcc´Â ±×°ÍÀÌ ÁÁ´Ù°í ´À³¢¸é ÃÖÀûÈ­¸¦ ÇÒ°ÍÀÌ´Ù.) ³ª´Â "volatile"¸¦ ÃÖ±Ù¿¡ »ç¿ëÇϵµ·Ï ±ÇÀåÇÑ´Ù. ±×¸®°í ±×°ÍÀ» ¿ì¸®´Â ¿©±â¿¡ »ç¿ëÇß´Ù. À̹ø¿¡´Â Ãâ·Â Çʵ带 »ç¿ëÇÏ´Â ¿¹¸¦ º¸ÀÚ. int i=0; __asm__ __volatile__(" pushl %%eax\n movl $1, %%eax\n movl %%eax, %0\n popl %%eax" : "=g" (i) ); /* i++; */ À̹ø ¿¹´Â ÀÌÀü¿¡ º¸¾Ò´ø ÀÔ·ÂÇʵ尡 ÀÖ´Â ¿¹Á¦¿Í °ÅÀÇ ºñ½ÁÇÏ´Ù. ±×¸®°í º° Å« Â÷À̵µ ¾ø´Ù. ¸ðµç Ãâ·Â ±ÔÁ¤¹®Àº "="°¡ Á¢µÎ¾î·Î ¼±ÇàÇÑ´Ù. À̰͵éÀº ¶ÇÇÑ ¾î¼Àºí¸® ±¸¹®¿¡¼­ "%0"¿¡¼­ "%N-1" ·Î ÂüÁ¶µÈ´Ù. ¿©·¯ºÐµéÀº ÀÔ·ÂÇʵå¿Í Ãâ·Â Çʵ尡 ÇÔ²² »ç¿ëµÇ¸é ¾î¶² ÀÏÀÌ ÀϾ´Â Áö ±Ã±ÝÇÒ °ÍÀÌ´Ù. ±Û½ê, ´ÙÀ½¿¹´Â µÎ°³¸¦ °°ÀÌ »ç¿ëÇÏ´Â °ÍÀ» º¸¿©ÁØ´Ù. int i=0, j=1, k=0; __asm__ __volatile__(" pushl %%eax\n movl %1, %%eax\n addl %2, %%eax\n movl %%eax, %0\n popl %%eax" : "=g" (k) : "g" (i), "g" (j) ); /* k = i + j; */ ¿©±â±îÁö´Â ÁÁ´Ù. ±×·¯³ª Á¶±Ý ÂóÂóÇÑ °ÍÀº ¾î¼Àºí¸® ±¸¹®¿¡ ÀÖ´Â ¼ýÀÚ°ªÀÌ´Ù. ¼³¸íÇÏ°Ú´Ù. [ÁÖÀÇ !] ÀÔ·ÂÇʵå¿Í Ãâ·ÂÇʵ带 °°ÀÌ »ç¿ëÇÒ¶§ [*** ] %0 ... %K are the outputs [*** ] %K+1 ... %N are the inputs À̹ø ¿¹¿¡¼­´Â "%0"´Â "k"¸¦ ÂüÁ¶ÇÏ°í, "%1"Àº "i" ±×¸®°í "%2"´Â "j"¸¦ ÂüÁ¶ÇÑ´Ù. ³Ê¹« °£´ÜÇÏÁö ¾ÊÀº°¡? ¾ÆÁ÷ ¸¶Áö¸· ÇʵåÀÎ º¯°æµÇ´Â ·¹Áö½ºÅÍ (registers-modified)´Â ¼³¸íÇÏÁö ¾Ê¾Ò´Ù. ¸¸ÀÏ ¿ì¸®°¡ ¾î¼Àºí¸® ±¸¹®¿¡¼­ ¾î¶² ·¹Áö½ºÅ͸¦ »ç¿ëÇÏ·Á°í Çϸé, "push"³ª "pop"À» ¸í½ÃÀûÀ¸·Î »ç¿ëÇϰųª, ¾Æ´Ï¸é ±×°ÍµéÀ» ¸ñ·ÏÀ» ÀÛ¼ºÇÏ¿© gcc°¡ ±×°ÍµéÀ» º¸È£Çϵµ·Ï ÇØ¾ß ÇÑ´Ù. ¿©±â¿¡ "eax"¸¦ ¹Ì¸® ÀúÀåÇÏÁöµµ ¾Ê°í º¹±Í½ÃÅ°Áöµµ ¾Ê´Â ¿¹°¡ ÀÖ´Ù. int i=0, j=1,k=0; __asm__ __volatile__(" movl %1, %%eax\n addl %2, %%eax\n movl %%eax, %0" : "=g" (k) : "g" (i), "g" (j) : "ax", "memory" ); /* k = i + j; */ º¯°æµÇ´Â-·¹Áö½ºÅÍ(registers-modified)¿¡¼­ "eax"¸¦ ¿ì¸®°¡ »ç¿ëÇϹǷΠgcc´Â ±× ·¹Áö½ºÅÍÀÇ °ªÀ» ÇÊ¿äÇÏ´Ù¸é ÀúÀå/º¹±Í½Ãų °ÍÀÌ´Ù. 16-bit ·¹Áö½ºÅÍ À̸§Àº 32,16,8ºñÆ® ·¹Áö½ºÅͱîÁöµµ ´Ù Ä¿¹öÇÑ´Ù. [ÁÖÀÇ !] ¿ì¸®°¡ ¸¸ÀÏ ¸Þ¸ð¸®±îÁöµµ °Ç´õ¸®°Ô µÈ´Ù¸é º¯°æµÇ´Â-·¹Áö½ºÅÍ(registers-modified) Çʵ忡 "memory"¸¦ ¸í½ÃÇϱ⸦ ±ÇÇÑ´Ù. ÀÌ°ÍÀº ¿ì¸®ÀÇ ¸ðµç ¿¹Á¦¿¡¼­ ÀÌ·¸°Ô ÇØ¾ß ÇÑ´Ù´Â °ÍÀ» ¶æÇϳª (ù¹ø° ¿¹¸¸ »©°í) ³ª´Â ´Ü¼ø¼º¶§¹®¿¡ ¾ÆÁ÷±îÁö ÀÌ°ÍÀ» »ç¿ëÇÏÁö ¾Ê¾Ò´Ù. ÀζóÀÎ ¾î¼Àºí¸®¾È¿¡ ÀÖ´Â Áö¿ª ¶óº§Àº "b"³ª "f"·Î ³¡³ª¾ß ÇÑ´Ù. ÀÌ°ÍÀº °¢°¢ ÈÄÁø ÂüÁ¶³ª ÀüÁøÂüÁ¶¸¦ ÀǹÌÇÑ´Ù. ¿¡¸¦ µé¸é, __asm__ __volatile__(" 0:\n ... jmp 0b\n ... jmp 1f\n ... 1:\n ... ); -------------------------------------------------------------- ¿ÜºÎ ¾î¼Àºí¸® ================ ¿©±â¿¡ ±× ½Ç¸¶¸®¸¦ Á¦°øÇÏ°Ú´Ù. ¸î°³ÀÇ C/C++ ÆÄÀÏÀ» ¾ò¾î¼­ "gcc -S file.c" ·Î ÄÄÆÄÀÏÇؼ­ file.S¸¦ ÂùÂùÈ÷ »ìÆ캸ÀÚ. ±âº»ÀûÀÎ ¿Ü¾çÀº : .file "myasm.S" .data somedata: .word 0 ... .text .globl __myasmfunc __myasmfunc: ... ret ¾Æ~¸ÅÅ©·Î, ¸ÅÅ©·Î... ¿©±â¿¡ ¿ÜºÎ ¾î¼Àºí¸® ÆÄÀÏÁ¦ÀÛÀ» Æí¸®Çϵµ·Ï µ½´Â include È­ÀÏÀ» »ðÀÔÇÒ ¼ö°¡ ÀÖ´Ù. ´ÜÁö ¾î¼Àºí¸® ¼Ò½ºÀÇ Á¦ÀÏ ¾ÕÂÊ¿¡ ±×°ÍÀ» »ðÀÔ½ÃÄѼ­ ¸ÅÅ©·Î¸¦ »ç¿ëÇÏ¸é µÈ´Ù. ¿¡¸¦ µé¸é ¿©±â¿¡ myasm.S °¡ ÀÖ´Ù: #include .file "myasm.S" .data .align 2 somedata: .word 0 ... .text .align 4 FUNC(__MyExternalAsmFunc) ENTER movl ARG1, %eax ... jmp mylabel ... mylabel: ... LEAVE ÀÌ°ÍÀº ¿ÜºÎ ¾î¼Àºí¸® Äڵ带 ÀÛ¼ºÇÏ´Â µ¥ ÁÁÀº °ñ°ÝÀÌ µÉ °ÍÀÌ´Ù. ---------------------------------------------------------------------------- ´Ù¸¥ Á¤º¸ ============ À̰͵éÀ» ¸ðµÎ´Ù ¹è¿ì´Â °¡ÀåÁÁÀº ¹æ¹ýÀº ´Ù¸¥ ¼Ò½º¸¦ ã¾Æº¸´Â °ÍÀÌ´Ù. "sys/farptr.h"ÆÄÀÏ¿¡ ÀζóÀÎ ¾î¼Àºí¸®°¡ Á¶±Ý ÀÖ´Ù. ¶ÇÇÑ ¸®´ª½º³ª FreeBSD µî À» »ç¿ë ÇÑ´Ù¸é Ä¿³Î¼Ò½º°¡ ÀÖ´Â °÷¿¡ (i386/ ...) dzºÎÇÑ ¾î¼Àºí¸® Äڵ尡 ÀÖ´Ù. ±×·¡ÇÈ/°ÔÀÓ ¶óÀ̺귯¸® ¼Ò½º°¡ ÀÖ´Â x2ftp.oulu.fi ÀÇ djgpp2/ µð·ºÅ丮µµ »ìÆ캸´Â °ÍÀÌ ÁÁÀ» °ÍÀÌ´Ù. ÀÎÅÚ ¹®¹ýÀÇ ¾î¼Àºí¸® ¼Ò½º¸¦ AT&T ¹®¹ýÀ¸·Î ¹Ù²Ù°í ½Í´Ù´øÁö ÀÎÅÚ ¹®¹ýÀÇ ±ÔÄ¢À» ¾Ë°í ½ÍÀ¸¸é ´ÙÀ½°ú °°ÀÌ ÇÒ ¼ö ÀÖ´Ù. * MASMÀ» ¾ò¾î¼­ ¼Ò½º¸¦ COFF Æ÷¸ËÀ¸·Î ÄÄÆÄÀÏÇÑ´Ù. (COFF´Â DJGPP¿¡¼­ »ç¿ëµÇ´Â ¿ÀºêÁ§Æ® ÆÄÀÏÀÇ Æ÷¸ËÀÌ´Ù.) * TASMÀ» AT&T ¾î¼Àºí¸®·Î ¹Ù²Ù´Â ta2asv08.zip À» ±¸ÇÑ´Ù. * .OBJ/.LIB¸¦ TASM°ú DJGPP»çÀÌ¿¡ º¯È¯À» ÇÏ´Â ta2asv08.zip À» ±¸ÇÑ´Ù. * ÀÎÅÚ°ú AT&T¹®¹ýÀ» º¯È¯ÇÏ´Â sed ½ºÅ©¸³Æ®¸¦ ±¸Çϱâ À§ÇØ mail archives ¸¦ µ¹¾Æ´Ù³à º»´Ù. ---------------------------------------------------------------------------- ¿¹Á¦ ========= /* inline1.c -- very simple gcc inline asm example -- Compile : gcc -o inline1 inline1.c */ #include inline int plus1(int a, int b) { int __res; /* ¸®ÅÏÇÒ °ª */ __asm__ ("add %%ebx, %%eax" /* ebx °ª + eax °ª ==> eax ¿¡ ÀúÀå */ : /* Ãâ·ÂÇÒ °ªÀº ¾øÀ½ */ :"a" ((int)a), "b" ((int)b)); /* aÀÇ °ªÀ» eax, bÀÇ °ªÀ» ebx¿¡ ³Ñ±è */ __res; /* ¸®ÅÏÇÔ */ } int plus2(int a, int b) { return (a+b); } void main(void) { int a = 222, b = 333, c = 0; c = plus1(a, b); printf("%d \n", c); c = plus2(a, b); printf("%d \n", c); }