ÀζóÀÎ ¾î¼Àºí¸® (inline assembly)

 ¾î¼Àºí¸®´Â ±â°è¾î¿¡ °¡Àå °¡±î¿î ÄÄÇ»ÅÍ ¾ð¾î¶ó°í ÇÕ´Ï´Ù. Visual C++ À̳ª µ¨ÆÄÀÌ, ºñÁÖ¾ó º£ÀÌÁ÷ °°Àº ¾ð¾î¿¡¼­µµ ¾î¼Àºí¸® ¾ð¾î¸¦ °°ÀÌ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. À̸¦ ÀζóÀÎ ¾î¼Àºí¸®¶ó°í ÇÏÁÒ.

 ÄÄÇ»ÅÍ ³»ºÎ¿¡´Â º¯¼öó·³ »ç¿ëÇÒ ¼ö ÀÖ´Â ¸Þ¸ð¸® °ø°£ÀÌ Àִµ¥, À̸¦ ·¹Áö½ºÅÍ(register) ¶ó°í ÇÕ´Ï´Ù. 16ºñÆ®ÀÇ ·¹Áö½ºÅÍ·Î AX, BX, CX, DX µîÀÇ ¹ü¿ë ·¹Áö½ºÅͰ¡ ÀÖ½À´Ï´Ù. À̸¦ È¿À²ÀûÀ¸·Î Ç¥½ÃÇϱâ À§ÇØ ÇÏÀ§ 8ºñÆ®¿Í »óÀ§ 8ºñÆ®·Î ³ª´©¾î »ç¿ëÇϱ⵵ ÇÕ´Ï´Ù.

AH, AL, BH, BLµîÀ¸·Î »óÀ§ 8ºñÆ®´Â H(High)·Î ÇÏÀ§ 8ºñÆ®´Â L(Low)·Î Ç¥½ÃÇϰí, 32ºñÆ®¿ëÀ¸·Î ¾Õ¿¡ E¸¦ ºÙ¿© EAX, EBX, ECX, EDX µîÀ¸·Î Ç¥½ÃÇϱ⵵ ÇÕ´Ï´Ù.

ÀζóÀÎ ¾î¼Àºí¸®¸¦ ÄÚµå¼Ó¿¡ Æ÷ÇÔ½Ã۱â À§Çؼ­ »ç¿ëÇÏ´Â ¿¹¾à¾î´Â °¢ ÄÄÆÄÀÏ·¯º°·Î Á¶±Ý¾¿ ´Ù¸£Áö¸¸, ºñÁÖ¾ó C++¿¡¼­´Â "__asm"À̶ó´Â ¿¹¾à¾î¸¦ »ç¿ëÇÕ´Ï´Ù.

 ´ÙÀ½Àº ÀζóÀÎ ¾î¼Àºí¸®ÀÇ Á¶±×¸¸ ¿¹Á¦ÀÔ´Ï´Ù. C++¾ð¾î·Î Á¶±Ý¾¿ ÁÖ¼®À» ´Þ¾Æ³õ¾Ò½À´Ï´Ù. µû·Î ¼³¸íÀ» ÇØÁÙ ÇÊ¿ä´Â ¾ø°ÚÁÒ?

 

#include "stdio.h"

// EAX, EBX, ECX, EDX          : 32 bit
// AX, BX, CX, DX                 : 16 bit
// AH, AL, BH, BL, CH, CL, DH, DL :  8 bit

void main()
{
        int addvar, pointvar1=5, pointvar2;
        int *p=&pointvar1;
        int cur = 1;
        int test1 = 1, test2 = 10;

        printf("The Size of (int)=%d Byte\n", sizeof(int));
        printf("So, %d Bit\n\n", sizeof(int)*8);

        __asm // ´õÇϱ⠿¹Á¦
        {
                MOV EAX, 10             // EAX = 10
                MOV EBX, 20             // EBX = 20
                ADD EAX, EBX           // EAX += EBX
                MOV addvar, EAX       // addvar = EAX
        }
        printf("ADD Test Result=%d\n", addvar);

        __asm // »©±â ¿¹Á¦
        {
                MOV EAX, 10           // EAX = 10
                MOV EBX, 20           // EBX = 20
                SUB EAX, EBX         // EAX += EBX
                MOV addvar, EAX     // addvar = EAX
        }
        printf("SUB Test Result=%d\n", addvar);

        __asm  // Æ÷ÀÎÅÍ »ç¿ë ¿¹Á¦
        {
                MOV EAX, 10           // EAX = 10
                MOV EBX, p             // EBX = p  
                ADD EAX, [EBX]      // EAX += *EBX  -> [EAX]´Â EAXÀÇ ÁÖ¼Ò°¡ °¡¸£Å°´Â °ª  
                MOV pointvar2, EAX  // pointvar2 = EAX          
        }
        printf("Pointer Test Result=%d\n", pointvar2);

   __asm  // ºñ±³ºÐ±â ¿¹Á¦
   {
           CMP cur, 1    // if(cur==1)
           JE go1          // goto go1
           
           CMP cur, 2    // if(cur==2)
           JE go2          // goto go2

go1:
           MOV EAX, cur    // EAX = cur
           ADD EAX, 100    // EAX += 100
           MOV cur, EAX    // cur = EAX

go2:
           MOV EAX, cur    // EAX = cur
           ADD EAX, 200    // EAX += 200
           MOV cur, EAX    // cur = EAX
   }
   printf("Compare Test Result=%d\n", cur);

   __asm // Áõ°¡ ¿¹Á¦
   {
           MOV EAX, test1         // EAX = test1
           INC EAX                   // EAX++
           MOV test2, EAX         // test2 = EAX
   }
   printf("test1=%d, Increased test1=%d\n", test1, test2);

   __asm // °¨¼Ò ¿¹Á¦
   {
           MOV EAX, test1         // EAX = test1
           DEC EAX                  // EAX--  
           MOV test2, EAX         // test2 = EAX
   }
   printf("test1=%d, decreased test1=%d\n", test1, test2);

   __asm // ġȯ ¿¹Á¦
   {
           MOV EAX, test1      // EAX = test1
           MOV EBX, test2      // EBX = test2
           XCHG EAX, EBX     // swap EAX, EBX
           MOV test1, EAX      // test1 = EAX
           MOV test2, EBX      // test2 = EBX
   }
   printf("After XCHG : test1=%d, test2=%d\n", test1, test2);

}

- the end of this article -