3.1. GCC ÀζóÀÎ ¾î¼Àºí·¯

¾ÆÁÖ À¯¸íÇÑ GNU C/C++ ÄÄÆÄÀÏ·¯ÀÎ GCC ÀÌ´Ù. ÀÌ ÄÄÆÄÀÏ·¯´Â GNU ÇÁ·ÎÁ§Æ®ÀÇ ÇÙ½ÉÀÌ µÇ´Â 32ºñÆ® ÄÄÆÄÀÏ·¯ÀÌ´Ù. ¸Å¿ì, ¸Å¿ì(!) ÁÁÀº Äڵ带 »ý»êÇϸç, x86 ¾ÆÅ°ÅØÃÄÀÇ ÇÁ·Î¼¼¼­ ¶ÇÇÑ ¸Å¿ì Àß Áö¿øÇÑ´Ù. ÀÌ ÄÄÆÄÀÏ·¯¿¡´Â C ÇÁ·Î±×·¥ ÄÚµå Áß°£¿¡ ÀζóÀÎ ¾î¼Àºí¸®¸¦ »ðÀÔÇÒ ¼ö ÀÖ´Â ±â´ÉÀ» °¡Áö°í Àִµ¥, À̸¦Å׸é, ·¹Áö½ºÅÍ ÇÒ´ç°ú °°Àº °ÍÀ» gcc °¡ ½º½º·Î ÇÏ°Ô Çϰųª, ¶Ç´Â ÇÁ·Î±×·¡¸Ó°¡ ¿øÇÏ´Â ´ë·Î Á¶Á¤Çؼ­, ¿øÇÏ´Â ·¹Áö½ºÅ͸¦ ÇÒ´çÇÏ°Ô ÇÒ ¼öµµ ÀÖ´Ù. °Ô´Ù°¡, gcc ´Â °ÅÀÇ ´ëºÎºÐÀÇ Ç÷§Æû¿¡¼­ »ç¿ë°¡´ÉÇÏ´Ù. ¸®´ª½º, *BSD, VSTa, OS/2, *DOS, Win* µî°ú °°ÀÌ ±¤¹üÀ§ÇÑ ¿î¿µÃ¼Á¦¿¡¼­ »ç¿ë °¡´ÉÇÏ´Ù.

3.1.1. GCC ¸¦ ¾îµð¼­ ±¸ÇÒ °ÍÀΰ¡?

°¡Àå ÁÖµÈ »çÀÌÆ®´Â GNU ÀÇ FTP »çÀÌÆ® ( ftp://prep.ai.mit.edu/pub/gnu/gcc/) ÀÌ´Ù. ÀÌ »çÀÌÆ®´Â GNU ÇÁ·ÎÁ§Æ®ÀÇ »ê¹°ÀÎ ¸¹Àº ÀÚÀ¯ ¼ÒÇÁÆ®¿þ¾îµéÀÌ ÄÄÆÄÀÏµÈ ÇüÅ ȤÀº ¼Ò½ºÀÇ ÇüÅ·Π¹ßÇ¥µÇ´Â °÷ÀÌ´Ù. ¸®´ª½º¿¡ ¸ÂÃç¼­ ¼³Á¤ ¹× ÄÄÆÄÀÏµÈ ¹öÁ¯µéÀº ftp://metalab.unc.edu/pub/Linux/GCC/ ¿¡¼­ ãÀ» ¼ö ÀÖ´Ù. ¶ÇÇÑ, ¼¼°è °¢Ã³¿¡ FTP ¹Ì·¯ »çÀÌÆ®µéÀÌ ÀÖ´Ù. ¿øÇÑ´Ù¸é, CD-ROM À¸·Îµµ ±¸ÇÒ ¼ö ÀÖ´Ù.

GCC ÀÇ °³¹ßÀº ÀÏÀü¿¡ GCC2.8 °ú EGCS ÆÐŰÁöÀÇ µÎ°³ÀÇ °¡Áö·Î ³ª´©¾îÁ³¾ú´Ù. ±×·¯³ª ÃÖ±Ù¿¡ ¿Í¼­ ÀÌ µÎ ÆÐŰÁö´Â ÅëÇյǾ °³¹ß ¹× ¹èÆ÷µÇ°í ÀÖ´Ù. ÇöÀç GCC ÀÇ À¥ÆäÀÌÁö´Â http://gcc.gnu.org ÀÌ´Ù.

¿©·¯ºÐÀÌ Áñ°Ü »ç¿ëÇÏ´Â ¿î¿µÃ¼Á¦¸¦ Ÿ°ÙÀ¸·Î ¸¸µé¾îÁø ¼Ò½º³ª ¹ÙÀ̳ʸ® ¶ÇÇÑ ¿©·¯ºÐÀÌ ÀÚÁÖ °¡´Â ¿©·¯ºÐ ¿î¿µÃ¼Á¦ÀÇ FTP »çÀÌÆ®µé¿¡¼­ ãÀ» ¼ö ÀÖÀ» °ÍÀÌ´Ù.

GCC ÀÇ DOS ¹öÁ¯Àº DJGPP ¶ó°í ºÒ¸®¿ì´Âµ¥, http://www.delorie.com/djgpp/ ¿¡¼­ ±¸ÇÒ ¼ö ÀÖ´Ù.

¶ÇÇÑ Win32 ¿ëÀÇ GCC Æ÷Æ®µµ ÀÖ´Ù : cygwin ( http://sourceware.cygnus.com/cygwin/) °ú mingw (http://www.mingw.org) °¡ ±×°ÍÀÌ´Ù.

½ÉÁö¾î OS/2 ¿ëÀÇ GCC Æ÷Æ®µµ ÀÖ´Ù. À̰ÍÀº EMX ¶ó°í ºÒ¸®¿î´Ù. ±¸ÇÒ ¼ö ÀÖ´Â URL Àº ´ÙÀ½°ú °°´Ù. ftp://ftp-os2.cdrom.com/pub/os2/emx09c/. ¿©±â¼­ ±¸ÇÒ ¼ö ÀÖ´Â EMX ´Â µµ½º¿¡¼­µµ ÀÛµ¿Çϸç, ÆÐŰÁö¿¡´Â À¯´Ð½º ¿¡¹Ä·¹À̼ÇÀ» À§ÇÑ ¸ñÀûÀº ¶óÀ̺귯¸® ·çƾµµ Æ÷ÇԵǾî ÀÖ´Ù. ¾ÕÀÇ »çÀÌÆ®¿¡¼­ ¿©±âÀú±â¸¦ µÑ·¯º¸°í ã¾Æ º¸¶ó.

There is also an OS/2 port of GCC called EMX; it works under DOS too, and includes lots of unix-emulation library routines.

3.1.2. GCC ÀζóÀÎ ¾î¼Àºí·¯¿¡ °üÇÑ ¹®¼­¸¦ ¾îµð¼­ ãÀ» ¼ö Àִ°¡

GCC ¹®¼­´Â TeXinfo Æ÷¸äÀ¸·Î ¹®¼­ÆÄÀϵéÀ» Æ÷ÇÔÇÑ´Ù. ¿©·¯ºÐÀº ±× ¹®¼­µéÀº TeX À» ÀÌ¿ëÇÏ¿© ÄÄÆÄÀÏÇØ Ãâ·ÂÇØ º¼ ¼öµµ ÀÖ°í, .info ÆÄÀÏ·Î º¯È¯Çؼ­ emacs ¿¡¼­ ºê¶ó¿ì¡ Çϸ鼭 ÀÐÀ»¼öµµ ÀÖ´Ù. ¶Ç´Â, .html ÆÄÀÏ·Î º¯È¯ÇÏ¿© À¥ ºê¶ó¿ìÀú¿¡¼­ ÀÐÀ» ¼öµµ ÀÖ°í... ±âŸ ¿©·¯ºÐµéÀÌ ÁÁ¾ÆÇÏ´Â Æ÷¸äÀ¸·Î º¯È¯ÇÒ ¼ö ÀÖ´Ù. .info ÆÄÀÏÀº GCC¸¦ Á¦´ë·Î ¼³Ä¡Çß´Ù¸é ÇÔ²² ¼³Ä¡µÇ¾úÀ» °ÍÀÌ´Ù.

¿©·¯ºÐÀÌ Á¤º¸¸¦ ¾ò±â À§Çؼ­ ã¾Æ¾ß ÇÒ ¼½¼ÇÀº C Extensions::Extended Asm:: ¼½¼ÇÀÌ´Ù.

¶ÇÇÑ, Invoking GCC::Submodel Options::i386 Options:: ¼½¼Ç¿¡ ÀÖ´Â ³»¿ëµµ »ó´çÈ÷ À¯¿ëÇÒ °ÍÀÌ´Ù. ƯÈ÷³ª ÀÌ ¼½¼ÇÀ» ÀÚ¼¼È÷ »ìÆìº¸¸é, i386 °è¿­ÀÇ ·¹Áö½ºÅ͸¦ À§ÇØ ±ÔÁ¤µÈ À̸§¿¡ ´ëÇÑ Á¤º¸¸¦ ¾òÀ» ¼ö Àִµ¥ : abcdSDB °¡ °¢°¢ %eax, %ebx, %ecx, %edx, %esi, %edi, %ebp °ú Çϳª¾¿ ÀÏÄ¡ÇÏ°Ô µÈ´Ù. (´Ü %esp ¿¡ ÇØ´çÇÏ´Â °ÍÀº ¾øÀ½),

À¥ÀÇ DJGPP °ÔÀÓÁî ¸®¼Ò½º ÆäÀÌÁö¿¡ ¾î¼Àºí¸®¿¡ °üÇÑ ³»¿ëÀÌ ¸Å¿ì ¸¹ÀÌ ÀÖ¾ú´Âµ¥... Áö±ÝÀº ¼­¹ö°¡ Á×¾î ÀÖ´Â°Í °°´Ù. ±×·¯³ª, ÀÚ·á´Â DJGPP »çÀÌÆ® ¿¡ º¹±¸µÇ¾î ÀÖ´Ù. ÀÌ »çÀÌÆ®¿¡´Â ´Ù¸¥ À¯¿ëÇÑ Á¤º¸µéµµ ¸¹ÀÌ Á¸ÀçÇÑ´Ù : http://www.delorie.com/djgpp/doc/brennan/, ¶ÇÇÑ, Á¤¸» À¯¿ëÇÑ ÀÚ·áÀÎ DJGPP Quick ASM Programming Guide µµ ã¾Æº¼ ¼ö ÀÖ´Ù.

GCC ´Â ¾î¼Àºí¸® ¼Ò½º¸¦ ¾î¼Àºí Çϱâ À§Çؼ­ GAS ¿¡ ÀÇÁ¸Çϸç, GAS ÀÇ ¹®¹ýÀ» µû¸¥´Ù(¾Æ·¡¸¦ º¸¶ó:) ÀζóÀÎ ¾î¼Àºí¸®¸¦ ¾µ ¶§, ÆÛ¼¾Æ® ¹®ÀÚ´Â µû¿ÈÇ¥·Î µÑ·¯½Î¾ß ÇÑ´Ù´Â °ÍÀ» ¸í½ÉÇ϶ó. ÆÛ¼¾Æ® ¹®ÀÚ´Â GAS ·Î ³Ñ°ÜÁö°Ô µÈ´Ù. ÀÚ¼¼ÇÑ ³»¿ëÀº ¾Æ·¡ÀÇ GAS ¿¡ °ü·ÃµÈ ¼½¼ÇÀ» º¸¶ó.

±×¸®°í, Á¤¸» À¯¿ëÇÑ ¿¹Á¦µéÀÇ ÁýÇÕüÀÎ linux/include/asm-i386/ µð·ºÅ丮 ¾Æ·¡¸¦ »ìÆìº¸¶ó. ¶ÇÇÑ, ¸®´ª½º Ä¿³ÎÀÇ ¼­ºêµð·ºÅ丮µéµµ »ìÆìº¸µµ·Ï Ç϶ó. À¯¿ëÇÑ ¿¹Á¦µéÀ» Á¤¸»·Î ¸¹ÀÌ ¾òÀ» ¼ö ÀÖÀ» °ÍÀÌ´Ù.

3.1.3. GCC ¸¦ ÀÌ¿ëÇÏ¿© ÀζóÀÎ ¾î¼Àºí¸® Äڵ带 »ý¼ºÇϱâ

Ä¿³Î Çì´õµé¿¡¼­ ã¾Æº¼ ¼ö ÀÖ´Â ¾î¼Àºí¸® ·çƾµéÀº extern inline ÇÔ¼öµé ³»ºÎ¿¡ µé¾î°¡ Àֱ⠶§¹®¿¡, (¸¸¾à ¿©·¯ºÐÀÌ ¿©·¯ºÐÀÌ ¸¸µç Çì´õÆÄÀÏÀ» °¡Áö°í ÀÖÀ¸¸ç, ¿©·¯ºÐÀÇ ¾î¼Àºí¸® Äڵ带 ¸®´ª½º Ä¿³ÎÀÇ ±×°Íó·³ ¸í·áÇÏ°Ô ÀÛ¼ºÇÏ°í ½Í´Ù¸é ¿©·¯ºÐµµ ±×ó·³ ÇÏ¸é µÈ´Ù) ÀÌµé ·çÆ¾µéÀÌ »ç¿ë°¡´ÉÇÏ°Ô Çϱâ À§Çؼ­ GCC ´Â ¹Ýµå½Ã -O Ç÷¡±×¿Í ÇÔ²² ½ÇÇàµÇ¾î¾ß ÇÑ´Ù. (¶Ç´Â -O2, -O3 µî°ú °°Àº ¿É¼Ç°ú ÇÔ²² ½ÇÇàµÇ¾î¾ß ÇÑ´Ù.) ±×·¸°Ô ÇÏÁö ¾ÊÀ¸¸é, ¿©·¯ºÐÀÇ ÄÚµå´Â ÄÄÆÄÀϵɷ±Áö´Â ¸ô¶óµµ, Á¦´ë·Î ¸µÅ©µÇÁö´Â ¾ÊÀ» °ÍÀÌ´Ù. ¿Ö³ÄÇϸé, ÇÁ·Î±×·¥ÀÌ ¸µÅ©µÉ ¶§, ¸µÄ¿´Â ÀζóÀÎÀÌ ¾Æ´Ñ extern ÇÔ¼öµéÀ» ¿©·¯ºÐÀÇ ÇÁ·Î±×·¥ÀÌ ¸µÅ©µÉ ¶óÀ̺귯¸®¿¡¼­ ã±â ¶§¹®ÀÌ´Ù. ¶Ç ´Ù¸¥ ¹æ¹ýÀº ·çƾµéÀÇ fallback ¹öÁ¯ÀÌ Á¸ÀçÇÏ´Â ¶óÀ̺귯¸®¿Í ¸µÅ©½ÃŰ´Â °ÍÀÌ´Ù.

Because assembly routines from the kernel headers (and most likely your own headers, if you try making your assembly programming as clean as it is in the linux kernel) are embedded in extern inline functions, GCC must be invoked with the -O flag (or -O2, -O3, etc), for these routines to be available. If not, your code may compile, but not link properly, since it will be looking for non-inlined extern functions in the libraries against which your program is being linked! Another way is to link against libraries that include fallback versions of the routines.

ÀζóÀÎ ¾î¼Àºí¸®°¡ »ç¿ëÇϱ⠽ȴٸé, -fno-asm Ç÷¡±×¸¦ ÁÖ¸é µÈ´Ù. ±×·¸°Ô Çϸé, ÄÄÆÄÀÏ·¯´Â È®Àå ¹®¹ýÀÎ ÀζóÀÎ ¾î¼Àºí¸®°¡ ¹ß°ßµÇ¾úÀ» °æ¿ì, Á¾·áÇÏ°Ô µÈ´Ù. ±×·¸Áö ¾ÊÀ¸¸é, ¸µÄ¿°¡ ÀνÄÇÏÁö ¸øÇÏ´Â ¿ÜºÎÇÔ¼öÀÎ asm() ÇÔ¼ö¿¡ ´ëÇÑ È£ÃâÀ» »ý¼ºÇÏ°Ô µÇ¾î¹ö¸°´Ù. (¹ø¿ªÀÌ Á» ÀÌ»óÇϳ׿ä... -_-a) ±× ¹Ý´ëÀÇ Ç÷¡±×´Â -fasm ¿É¼ÇÀ¸·Î½á, asm Ű¿öµå¿¡ ´ëÇÑ Ãë±Þ¹æ¹ýÀ» º¹±¸ÇÑ´Ù(?)

which will have the compiler die when using extended inline asm syntax, or else generate calls to an external function named asm() that the linker can't resolve. To counter such flag, -fasm restores treatment of the asm keyword.

º¸´Ù ÀϹÝÀûÀÎ °ÍÀ¸·Î½á, x86 Ç÷§Æû¿¡¼­ ½ÇÇàµÇ´Â gcc ¿¡ ¸Å¿ì À¯¿ëÇÑ Ç÷¡±×°¡ Àִµ¥, ¹Ù·Î

gcc -O2 -fomit-frame-pointer -W -Wall

ÀÌ´Ù. -O2 ´Â ÀϹÝÀûÀ¸·Î, ¾µ¸¸ÇÑ ÃÖÀûÈ­ ·¹º§ÀÌ´Ù. ±× ¿ÜÀÇ ÃÖÀûÈ­ ·¹º§Àº ÄÄÆÄÀÏÇϴµ¥ ½Ã°£ÀÌ ´õ ¿À·¡ ±Û¸®°í, ´õ Å« Äڵ带 »ý»êÇÑ´Ù. ±×·³¿¡µµ ºÒ±¸Çϰí, »ý¼ºµÈ ÄÚµåÀÇ ¼öÇ༺´ÉÀº ¾à°£ ´õ »¡¶óÁú »ÓÀÌ´Ù. °úµµÇÑ ÃÖÀûÈ­ ¿É¼ÇÀ» Á־ È¿°úÀûÀÎ °ÍÀº ¸Å¿ì ŸÀÌÆ®ÇÑ ·çÇÁ°¡ ÀÖÀ»¶§ »ÓÀÌ´Ù. ¿©·¯ºÐÀÌ Á¤¸», °­·ÂÇÑ(!) ÃÖÀûÈ­ ÄÄÆÄÀÏÀ» ÇÊ¿ä·Î ÇÏ´Â °æ¿ì¿¡´Â -O6 ÀÇ ·¹º§±îÁö »ç¿ëÇÏ´Â °ÍÀº °í·ÁÇØ º½Á÷ÇÏ´Ù.

-fomit-frame-pointer ¿É¼ÇÀº ¾µµ¥¾ø´Â frameÆ÷ÀÎÅÍ(¿ªÀÚÁÖ : stack ÀÇ ³»¿ëÀ» º¹±¸ÇÏ´Â °Í°ú °ü·ÃµÇ¾î¼­ ÄÄÆÄÀÏ·¯ ³»ºÎÀûÀ¸·Î »ý¼ºÇÏ´Â Æ÷ÀÎÅÍÀÔ´Ï´Ù.) ¸¦ À¯ÁöÇÏ´Â Äڵ带 »ý¼ºÇÏÁö ¾Êµµ·Ï ÇÑ´Ù. ±×·¸°Ô ÇÏ¸é »ý¼ºµÈ ¾î¼Àºí¸® ÄÚµå´Â º¸´Ù ÀÛ°í, ºü¸¥ °ÍÀÌ µÇ¸ç, ´õ ³ªÀº ÃÖÀûÈ­¸¦ À§ÇÑ ·¹Áö½ºÅ͵éÀÇ È®º¸¸¦ °¡´ÉÇÏ°Ô ÇØ ÁØ´Ù. ´Ü, µð¹ö±ë Åø (gdb ¿Í °°Àº..) À» »ç¿ëÇÑ µð¹ö±ëÀÌ ºÒ°¡´ÉÇØÁø´Ù.

-W -Wall ¿É¼ÇÀº À¯¿ëÇÑ °æ°í¸Þ¼¼ÁöµéÀ» ¹ß»ý½Ã۵µ·Ï ÇÑ´Ù. °æ°í¸Þ¼¼Áö¸¦ ÅëÇØ ¿©·¯ºÐÀº Ȥ½Ã ¹ß»ýÇÒÁöµµ ¸ð¸¦ ¾î¸®¼®Àº ¿¡·¯µéÀ» ¹Ì¸® üũÇÒ ¼ö ÀÖ°Ô ÇÑ´Ù.

¿©·¯ºÐÀº ÀÏ·ÃÀÇ ÇÁ·Î¼¼¼­ Á¾¼ÓÀûÀÎ ÃÖÀûÈ­ ¿É¼ÇÀ» ÁÙ ¼ö Àִµ¥, ¿¹¸¦ µé¸é, -m486 µî°ú °°Àº ¿É¼ÇÀÌ ±×°ÍÀÌ´Ù. ±×·¯ÇÑ CPU ƯÁ¤ÀÇ ¿É¼ÇÀ» ÁÜÀ¸·Î½á, GCC ´Â ¿©·¯ºÐÀÌ Å¸°ÙÀ¸·Î »ï´Â ÇÁ·Î¼¼¼­¿¡ º¸´Ù ´õ Àß ¸Â°í, ÃÖÀûÈ­µÈ Äڵ带 ¸¸µé¾î ÁÙ °ÍÀÌ´Ù. ¶ÇÇÑ, ÃÖ±ÙÀÇ GCC ´Â -mpentium °ú °°Àº Ç÷¡±×µµ °¡Áö°Ô µÇ¾ú´Ù. (GCC 2.7.x ¶Ç´Â ±× ÀÌÇÏÀÇ ¹öÁ¯¿¡¼­´Â Áö¿øÇÏÁö ¾Ê´Â´Ù.) ¶ÇÇÑ PGCC, ¼ÒÀ§ ÆæÆ¼¾ö GCC ¶ó´Â °ÍÀº ´õ ¸¹Àº ¿É¼ÇµéÀ» °¡Áö°í ÀÖ´Ù. ±¸ÇÒ ¼ö ÀÖ´Â Àå¼Ò´Â ´ÙÀ½°ú °°´Ù : http://goof.com/pcg/ ÀÌó·³ ƯÁ¤ ÇÁ·Î¼¼¼­¿¡ ÃÖÀûÈ­ ½ÃŰ´Â Ç÷¡±×µéÀº ¸®´ª½ºÀÇ Ä¿³ÎÀ» ÄÄÆÄÀÏ ÇÒ ¶§ º¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ¿©·¯ºÐÀÇ GCC ¿¡ µþ·Á¿Â TeXInfo ¹®¼­¸¦ È®ÀÎÇÏ¸é º¸´Ù ¸¹Àº Á¤º¸¸¦ ¾òÀ» ¼ö ÀÖ´Ù.

-m386 ¿É¼ÇÀº ÄÚµåÀÇ Å©±â¸¦ ÃÖÀûÈ­½Ãų ¼ö ÀÖµµ·Ï ÇØÁØ´Ù. ±×°ÍÀÌ Áß¿äÇÑ ÀÌÀ¯´Â ¸Þ¸ð¸® »ç¿ëÀ²ÀÌ ¸Å¿ì ³ôÀº ÄÄÇ»Å͵鿡¼­ ¼Óµµ¿¡ ÃÖÀûÈ­µÇ¾úÁö¸¸, ±× ÃÖÀûÈ­·Î ÀÎÇØ Å©±â°¡ ¸Å¿ì Å« ÇÁ·Î±×·¥À» ½ÇÇà½ÃŲ´Ù¸é, ½ÊÁßÆÈ±¸ ½º¿ÍÇÎÀÌ ¹ß»ýÇÏ°Ô µÇ¸ç, ±×·Î ÀÎÇØ ¿ø·¡ÀÇ ¸ñÀûÀÎ ºü¸¥ ¼ÓµµÀÇ È¿°ú¿¡ ¹ÝÇÏ´Â ÀÏÀÌ ¹ß»ýÇÑ´Ù. ÀÌ·² °æ¿ì¿¡´Â, C ¸¦ ¾²´Â °Í º¸´Ù, ÄÚµåÀÇ ºÐÇÒ(?)À» ±¸ÇöÇÑ ¾ð¾î (functional language ȤÀº FORTH ¶ó°í ºÒ¸®¿ì´Â ¾ð¾î¸¦ »ç¿ëÇØ¼­, ¹ÙÀÌÆ®Äڵ峪 ¿öµåÄڵ忡 ±âÃÊÇÑ ±¸ÇöÀ» Çϵµ·Ï Ç϶ó.)

In such settings, it might be useful to stop using C, and use instead a language that favors code factorization, such as a functional language and/or FORTH, and use a bytecode- or wordcode- based implementation.

¿©·¯ºÐÀº ÃÖÀûÈ­ ¿É¼ÇÀ» ÆÄÀϺ°·Î ´Ù ´Ù¸£°Ô ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. ±×·¡¼­, ¸Å¿ì ÁÁÀº ¼º´ÉÀÌ ¿ä±¸µÇ´Â ·çƾÀ» ´ã°í ÀÖ´Â ÆÄÀÏ¿¡´Â ÃÖ°í ·¹º§ÀÇ ¼Óµµ¸¦ ³¾ ¼ö ÀÖµµ·Ï ÃÖÀûÈ­¸¦ ¼öÇàÇϰí, ´Ù¸¥ ÆÄÀÏ¿¡´Â »ý¼ºµÇ´Â ÄÚµåÀÇ Å©±â¸¦ ÀÛ°Ô ÇÏ´Â ¹æÇâÀ¸·Î ÃÖÀûÈ­ÇÒ ¼öµµ ÀÖ´Ù´Â °ÍÀ» À¯³äÇ϶ó.

Á» ´õ ³ªÀº ÃÖÀûÈ­¸¦ ½ÃŰ·Á¸é -mregparm=2 ¿É¼ÇÀ» »ç¿ëÇϰųª, ÇØ´çÇÏ´Â ÇÔ¼ö Ư¼ºÀ» »ç¿ëÇϴ°ÍÀÌ µµ¿òÀÌ µÉ °ÍÀÌ´Ù. ±×·¯³ª, ´Ù¸¥ ÄÚµå(libcµî°ú °°Àº)ÀÇ ¸µÅ©½Ã¿¡ ¸î°¡Áö ¹®Á¦°¡ ¹ß»ýÇÒ ¼ö ÀÖ´Ù´Â »ç½ÇÀ» ¸í½ÉÇ϶ó(¿ªÀÚÁÖ : ¹ø¿ªÀÌ Á¤¸»-_- ¸Å²ô·´Áö ¸øÇÕ´Ï´Ù.) To optimize even more, option -mregparm=2 and/or corresponding function attribute might help, but might pose lots of problems when linking to foreign code, including libc.

¿ÜºÎÀÇ ÇÔ¼öµéÀ» Á¤È®ÇÏ°Ô ¼±¾ðÇØ ÁÜÀ¸·Î½á, ¿Ã¹Ù¸¥ ¼ø¼­¿¡ µû¸¥ È£ÃâÀÌ ¹ß»ýÇϵµ·Ï Á¶Á¤ÇØ Áְųª, ¿ÜºÎ ¶óÀ̺귯¸®µéÀ» ¿©·¯ºÐÀÌ ¸¸µç ÇÁ·Î±×·¥°ú °°Àº ·¹Áö½ºÅ͸¦ »ç¿ëÇϴ ȣÃâ ÄÁº¥¼ÇÀ» »ç¿ëÇϵµ·Ï ÀçÄÄÆÄÀÏ ÇØ ÁÜÀ¸·Î½á, ¹®Á¦¸¦ ±Øº¹ÇÒ ¼ö Àֱ⵵ ÇÏ´Ù.

There are ways to correctly declare foreign functions so the right call sequences be generated, or you might want to recompile the foreign libraries to use the same register-based calling convention...

/usr/lib/gcc-lib/i486-linux/2.7.2.3/specs À» ÆíÁýÇØ¼­ ¿©·¯ºÐÀÇ make ¿¡ À§¿¡¼­ ¼³¸íÇÑ Ç÷¡±×µéÀÌ µðÆúÆ®°¡ µÇµµ·Ï ÇÒ ¼öµµ ÀÖ´Ù.(±×·¯³ª ±× °æ¿ì, -W -Wall ¿É¼ÇÀº µ¡ºÙÀÌÁö ¾Ê´Â °ÍÀÌ ³ªÀº °æ¿ìµµ ÀÖ´Ù.) ¿©·¯ºÐÀÇ ½Ã½ºÅÛ¿¡¼­ GCC specs ÆÄÀÏÀÇ Á¤È®ÇÑ À§Ä¡´Â gcc -v ¸¦ ÇÔÀ¸·Î½á ¾Ë ¼ö ÀÖ´Ù.

3.1.4. ¸ÅÅ©·ÎÀÇ Áö¿ø

GCC ´Â ¿©·¯ºÐÀÌ ¿©·¯ºÐÀÇ ÀζóÀÎ ¾î¼Àºí¸® ÄÚµå ³»¿¡ ·¹Áö½ºÅÍ ±Ô¾à(? - constraints)À» ¸í½ÃÇÏ´Â °ÍÀ» °¡´ÉÇÏ°Ô ÇÕ´Ï´Ù. ±×·³À¸·Î½á, ÃÖÀûÈ­ ÇÒ ¶§ ÄÄÆÄÀÏ·¯°¡ ±× »ç½ÇÀ» Âü°íÇÏ¿© ÀζóÀÎ ¾î¼Àºí¸® Äڵ尡 ÆÐÅϵéÀÇ ÁýÇÕÀ¸·Î »ý¼ºµÇµµ·Ï ÇÕ´Ï´Ù. (-_-; ³Ê¹« ¹ø¿ªÀ» ¸øÇÏ´Â °Å °°±º¿©)

GCC allows (and requires) you to specify register constraints in your inline assembly code, so the optimizer always know about it; thus, inline assembly code is really made of patterns, not forcibly exact code.

µû¶ó¼­ ¿©·¯ºÐÀº ¿©·¯ºÐÀÇ ¾î¼Àºí¸®¸¦ CPP ¸ÅÅ©·Î ¶óµçÁö, ÀζóÀÎÀÇ C ÇÔ¼öµé ³»ºÎ¿¡ Æ÷ÇÔ ½Ãų ¼ö ÀÖ½À´Ï´Ù. ±×·¸°Ô Çϸé, ´©±¸µçÁö, ±× ¾î¼Àºí¸® Äڵ带 Æò¹üÇÑ C ÇÔ¼ö³ª ¸ÅÅ©·Îó·³ »ç¿ëÇÒ ¼ö ÀÖ°Ô µË´Ï´Ù. ÀζóÀÎ ÇÔ¼öµéÀº ¸ÅÅ©·Î¿Í ¸Å¿ì ºñ½ÁÇÏ°Ô º¸ÀÌÁö¸¸, ¶§·Î´Â ´õ¿í ¸íÈ®ÇÏ¿© ¾²±â°¡ ´õ ½±´Ù. ±×·¯³ª, ¸ÅÅ©·Î¸¦ »ç¿ëÇϵç, ÀζóÀÎ ÇÔ¼ö¸¦ ¾²´ø, °è¼Ó Áߺ¹µÈ Äڵ带 ¾²°Ô µÈ´Ù´Â °ÍÀ» ¸í½ÉÇ϶ó. µû¶ó¼­, 1: °ú °°Àº ½ºÅ¸ÀÏÀÇ ·ÎÄà ·¹ÀÌºí¸¸ÀÌ ±×·¯ÇÑ ¾î¼Àºí¸® Äڵ忡¼­ Á¤Àǵǰí, »ç¿ëµÇ¾î¾ß ÇÑ´Ù. ±×·¯³ª, ¸ÅÅ©·Î´Â ·ÎÄà ·¹À̺í·Î Á¤ÀǵÇÁö ¾ÊÀº ·¹À̺íÀÌ ÆÄ¶ó¹ÌÅÍ·Î ³Ñ°ÜÁö´Â °ÍÀ» Çã¿ëÇÑ´Ù. (ȤÀº, ¿©·¯ºÐÀº ºÎ°¡ÀûÀÎ ¸ÞŸ ÇÁ·Î±×·¡¹Ö ±â¹ýÀ» »ç¿ëÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.) ¶ÇÇÑ, ÀζóÀÎ ¾î¼Àºí¸® Äڵ带 È®ÀåÇÏ°Ô µÇ¸é, ±× ÄÚµå ¾ÈÀÇ ÀáÀçÀûÀÎ ¹ö±× ¶ÇÇÑ ³ªÅ¸³¯ ¼ö ÀÖ´Ù. ±×·¯¹Ç·Î, ±×·¯ÇÑ ÀζóÀÎ ¾î¼Àºí¸® Äڵ忡¼­ ·¹Áö½ºÅÍ »ç¿ë¹æ¹ýÀ» ÀÌÁßÀ¸·Î °íÂûÇϵµ·Ï Ç϶ó.

Thus, you can make put your assembly into CPP macros, and inline C functions, so anyone can use it in as any C function/macro. Inline functions resemble macros very much, but are sometimes cleaner to use. Beware that in all those cases, code will be duplicated, so only local labels (of 1: style) should be defined in that asm code. However, a macro would allow the name for a non local defined label to be passed as a parameter (or else, you should use additional meta-programming methods). Also, note that propagating inline asm code will spread potential bugs in them; so watch out doubly for register constraints in such inline asm code.

¸¶Áö¸·À¸·Î, C ¾ð¾î ±× ÀÚü°¡ ¾î¼Àºí¸® ÇÁ·Î±×·¡¹ÖÀÇ ¸Å¿ì ÁÁÀº Ãß»óÈ­¶ó´Â °ÍÀ» ¸í½ÉÇϰí, C ¸¦ »ç¿ëÇÔÀ¸·Î½á, ¾î¼Àºí¸® ÇÁ·Î±×·¡¹Ö½Ã ¹ß»ýÇÒ ¼ö ÀÖ´Â ¸¹Àº ³­Á¡µé ±Øº¹Çϰí, º¸´Ù ½Å·Úµµ ³ôÀº ÇÁ·Î±×·¥À» ¿©·¯ºÐÀÌ ¸¸µé ¼ö ÀÖ°Ô µÉ °ÍÀÌ´Ù.

Lastly, the C language itself may be considered as a good abstraction to assembly programming, which relieves you from most of the trouble of assembling.