• µ¿±â
    • C ¾ð¾îÀÇ ÇÁ·Î±×·¥ÀÇ °£Æí¼º °ú assembly ¾ð¾îÀÇ ºü¸¥ ½ÇÇàµî µÎ ¾ð¾îÀÇ ÀåÁ¡À» »ì¸°´Ù.
      ¡¡
  • ¹æ¹ý
    • 1. inline assembly ¸¦ ÀÌ¿ëÇÏ´Â ¹æ¹ý
      • C ÇÁ·Î±×·¥³»¿¡ assembly ¾ð¾î¸¦ »ðÀÔ
      • ¿¹1)

      • ¡¡
        char const *message = "inline program example ...\n$";¡¡¡¡¡¡¡¡¡¡¡¡¡¡
        main()¡¡¡¡¡¡¡¡¡¡¡¡¡¡
        {¡¡¡¡¡¡¡¡¡¡¡¡¡¡
        ¡¡¡¡¡¡¡¡¡¡¡¡¡¡ asm mov ah, 9¡¡¡¡¡¡¡¡¡¡¡¡¡¡
        ¡¡¡¡¡¡¡¡¡¡¡¡¡¡ asm mov dx, message¡¡¡¡¡¡¡¡¡¡¡¡¡¡
        ¡¡¡¡¡¡¡¡¡¡¡¡¡¡ asm int 21h¡¡¡¡¡¡¡¡¡¡¡¡¡¡
        }
        ¡¡
        • ÇÁ·Î±×·¥À» test1.c ·Î ÀúÀåÈÄ Turbo-C 2.0 compiler ¿¡¼­ tcc test1.c Çϸé test1.exe °¡ ¸¸µé¾îÁü
        • test1.exe¸¦ ¼öÇàÇÏ¸é µÈ´Ù.
        ¡¡
      • ¿¹2)

      • ¡¡
        ¡¡
        #include¡¡¡¡¡¡¡¡¡¡¡¡¡¡ <stdio.h>¡¡¡¡¡¡¡¡¡¡¡¡¡¡
        main()¡¡¡¡¡¡¡¡¡¡¡¡¡¡
        {¡¡¡¡¡¡¡¡¡¡¡¡¡¡
        ¡¡¡¡¡¡¡¡¡¡¡¡¡¡ int¡¡¡¡¡¡¡¡ a,b,sum;¡¡¡¡¡¡¡¡¡¡¡¡¡¡
        ¡¡¡¡¡¡¡¡¡¡¡¡¡¡ printf("Enter two values: ");¡¡¡¡¡¡¡¡¡¡¡¡¡¡
        ¡¡¡¡¡¡¡¡¡¡¡¡¡¡ scanf("%d %d",&a,&b);¡¡¡¡¡¡¡¡¡¡¡¡¡¡

        ¡¡¡¡¡¡¡¡¡¡¡¡¡¡ asm mov dx, WORD PTR a¡¡¡¡¡¡¡¡¡¡¡¡¡¡
        ¡¡¡¡¡¡¡¡¡¡¡¡¡¡ asm add dx, WORD PTR b¡¡¡¡¡¡¡¡¡¡¡¡¡¡
        ¡¡¡¡¡¡¡¡¡¡¡¡¡¡ asm mov WORD PTR sum, dx¡¡¡¡¡¡¡¡¡¡¡¡¡¡

        ¡¡¡¡¡¡¡¡¡¡¡¡¡¡ printf("The sum is %d \n",sum);¡¡¡¡¡¡¡¡¡¡¡¡¡¡
        }

        ¡¡
          ¡¡
      2. C¿Í assembly ¾ð¾î·Î ÇÁ·Î±×·¥ÇÏ°í ÇÔ²² link ÇÏ´Â ¹æ¹ý
      • ¿¹ 1)¡¡ ´Ü¼øÇÑ function call
        • C ÇÁ·Î±×·¥À» ÀÛ¼º
        ¡¡
        #include <stdio.h>¡¡¡¡¡¡¡¡¡¡¡¡¡¡
        int¡¡¡¡¡¡¡¡ x,y,sum;¡¡¡¡¡¡¡¡¡¡¡¡¡¡
        extern¡¡ int¡¡¡¡¡¡¡¡ myadd();¡¡¡¡¡¡¡¡¡¡¡¡¡¡
        main()¡¡¡¡¡¡¡¡¡¡¡¡¡¡
        {¡¡¡¡¡¡¡¡¡¡¡¡¡¡
        ¡¡¡¡¡¡¡¡¡¡¡¡¡¡ x = 22;¡¡¡¡¡¡¡¡¡¡¡¡¡¡
        ¡¡¡¡¡¡¡¡¡¡¡¡¡¡ y = 23;¡¡¡¡¡¡¡¡¡¡¡¡¡¡
        ¡¡¡¡¡¡¡¡¡¡¡¡¡¡ myadd();¡¡¡¡¡¡¡¡¡¡¡¡¡¡
        ¡¡¡¡¡¡¡¡¡¡¡¡¡¡ printf("x = %d, y = %d, sum = %d \n",x,y,sum);¡¡¡¡¡¡¡¡¡¡¡¡¡¡
        }
        ¡¡
        • ÇÁ·Î±×·¥À» lktest.c ·Î ÀúÀå
        • assembly ·Î ÇÁ·Î±×·¥ ÀÛ¼º
        ¡¡
        .MODEL¡¡ SMALL¡¡¡¡¡¡¡¡¡¡¡¡¡¡
        .DATA¡¡¡¡¡¡¡¡¡¡¡¡¡¡
        EXTRN¡¡¡¡ _x:WORD, _y:WORD, _sum:WORD¡¡¡¡¡¡¡¡¡¡¡¡¡¡
        .CODE¡¡¡¡¡¡¡¡¡¡¡¡¡¡
        PUBLIC¡¡ _myadd¡¡¡¡¡¡¡¡¡¡¡¡¡¡
        _myadd¡¡ PROC NEAR¡¡¡¡¡¡¡¡¡¡¡¡¡¡
        ¡¡¡¡¡¡¡¡¡¡¡¡¡¡ MOV AX,_x¡¡¡¡¡¡¡¡¡¡¡¡¡¡
        ¡¡¡¡¡¡¡¡¡¡¡¡¡¡ ADD AX,_y¡¡¡¡¡¡¡¡¡¡¡¡¡¡
        ¡¡¡¡¡¡¡¡¡¡¡¡¡¡ MOV _sum,AX¡¡¡¡¡¡¡¡¡¡¡¡¡¡
        ¡¡¡¡¡¡¡¡¡¡¡¡¡¡ RET¡¡¡¡¡¡¡¡¡¡¡¡¡¡
        _myadd¡¡ ENDP¡¡¡¡¡¡¡¡¡¡¡¡¡¡
        ¡¡¡¡¡¡¡¡¡¡¡¡¡¡ END
        ¡¡
        • ÇÁ·Î±×·¥À» lktest2.asm À¸·Î ÀúÀå
        • tcc lktest.c lktest2.asm Çϸé
        • lktest.exe °¡ »ý¼ºµÊ
        • lktest.exe ½ÇÇà
      • ¿¹ 2) C¿¡¼­ assembly ·Î ÆĶó¸ÞÅÍ Àü´ÞÇϱ⡡
        • C ÇÁ·Î±×·¥À» ÀÛ¼º
        ¡¡
        #include <stdio.h>¡¡¡¡¡¡¡¡¡¡¡¡
        extern¡¡ int¡¡¡¡¡¡¡¡ myadd();¡¡¡¡¡¡¡¡¡¡¡¡
        main()¡¡¡¡¡¡¡¡¡¡¡¡
        {¡¡¡¡¡¡¡¡¡¡¡¡
        ¡¡¡¡¡¡¡¡¡¡¡¡¡¡ int x = 22, y = 23, sum;¡¡¡¡¡¡¡¡¡¡¡¡
        ¡¡¡¡¡¡¡¡¡¡¡¡¡¡ sum = myadd(x,y);¡¡¡¡¡¡¡¡¡¡¡¡
        ¡¡¡¡¡¡¡¡¡¡¡¡¡¡ printf("x = %d, y = %d, sum = %d \n",x,y,sum);¡¡¡¡¡¡¡¡¡¡¡¡
        }
        ¡¡
        • ÇÁ·Î±×·¥À» lkparam.c ·Î ÀúÀå
        • assembly ·Î ÇÁ·Î±×·¥ ÀÛ¼º
        ¡¡
        .MODEL¡¡ SMALL¡¡¡¡ ¡¡¡¡¡¡¡¡¡¡
        .CODE¡¡¡¡¡¡¡¡¡¡¡¡
        PUBLIC¡¡ _myadd¡¡¡¡¡¡¡¡¡¡¡¡
        _myadd¡¡ PROC NEAR¡¡¡¡¡¡¡¡¡¡¡¡
        ¡¡¡¡¡¡ PUSH BP¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡; BPÀÇ ³»¿ëÀÌ º¯°æµÊÀ¸·Î ÀúÀå¡¡¡¡¡¡¡¡¡¡¡¡
        ¡¡¡¡¡¡ MOV¡¡ BP,SP¡¡¡¡¡¡¡¡¡¡¡¡; SP °ªÀ» BP ·Î ¿Å°ÜÁÜ¡¡¡¡¡¡¡¡¡¡¡¡
        ¡¡¡¡¡¡ PUSH DX¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ ; »ç¿ëÇÒ ·¹Áö½ºÅÍ °ª ÀúÀå¡¡¡¡¡¡¡¡¡¡¡¡
        ¡¡¡¡¡¡ MOV¡¡ DX, [BP+4]¡¡¡¡¡¡ ; x °ªÀ» ½ºÅÿ¡¼­ °¡Á®¿Å¡¡¡¡¡¡¡¡¡¡¡¡
        ¡¡¡¡¡¡ ADD¡¡ DX, [BP+6]¡¡¡¡¡¡ ; y °ªÀ» ½ºÅÿ¡¼­ °¼Á®´Ù°¡¡¡ ´õÇÔ¡¡¡¡¡¡¡¡¡¡¡¡
        ¡¡¡¡¡¡ MOV¡¡ AX, DX¡¡¡¡¡¡¡¡¡¡ ; return ÇÒ °ªÀº AX¿¡ ÀúÀå¡¡¡¡¡¡¡¡¡¡¡¡
        ¡¡¡¡¡¡ POP DX¡¡¡¡¡¡¡¡¡¡¡¡
        ¡¡¡¡¡¡ POP BP¡¡¡¡¡¡¡¡¡¡¡¡
        ¡¡¡¡¡¡ RET¡¡¡¡¡¡¡¡¡¡¡¡
        _myadd¡¡ ENDP¡¡¡¡¡¡¡¡¡¡¡¡
        ¡¡¡¡¡¡ END
        ¡¡
        • ÇÁ·Î±×·¥À» lkparam2.asm À¸·Î ÀúÀå
        • tcc lkparam.c lkparam2.asm Çϸé
        • lkparam.exe °¡ »ý¼ºµÊ
        • lkparam.exe ½ÇÇà
      • ¿¹ 3) C¿¡¼­ assembly ·Î array ÁÖ¼Ò Àü´ÞÇϱâ
        • C ÇÁ·Î±×·¥À» ÀÛ¼º
        ¡¡
        int¡¡¡¡¡¡¡¡ num[3]={0x10,0x20,0x30};¡¡¡¡
        extern¡¡ arrayadd();¡¡¡¡
        main()¡¡¡¡
        {¡¡¡¡
        ¡¡¡¡¡¡¡¡¡¡¡¡¡¡ printf("sum of num array = %x \n", arrayadd(num));¡¡¡¡
        }
        ¡¡
        • ÇÁ·Î±×·¥À» array.c ·Î ÀúÀå
        • assembly ·Î ÇÁ·Î±×·¥ ÀÛ¼º¡¡
        ¡¡
        .MODEL¡¡ SMALL¡¡¡¡
        .CODE¡¡¡¡
        PUBLIC _arrayadd¡¡¡¡
        _arrayadd PROC NEAR¡¡¡¡
        ¡¡¡¡¡¡¡¡¡¡¡¡¡¡ PUSH BP¡¡¡¡¡¡¡¡ ; store BP to stack¡¡¡¡
        ¡¡¡¡¡¡¡¡¡¡¡¡¡¡ MOV¡¡ BP,SP¡¡¡¡ ; BP points to stack top¡¡¡¡
        ¡¡¡¡¡¡¡¡¡¡¡¡¡¡ PUSH SI¡¡¡¡¡¡¡¡¡¡; store SI to stack¡¡¡¡
        ¡¡¡¡¡¡¡¡¡¡¡¡¡¡ XOR¡¡ AX, AX¡¡¡¡ ; clear AX¡¡¡¡
        ¡¡¡¡¡¡¡¡¡¡¡¡¡¡ MOV¡¡ CX, 3¡¡¡¡¡¡¡¡ ; number of elements of array¡¡¡¡
        ¡¡¡¡¡¡¡¡¡¡¡¡¡¡ MOV¡¡ SI, [BP+4] ; near call, then [BP+4] points to address of array¡¡¡¡
        LOOP1:¡¡¡¡
        ¡¡¡¡¡¡¡¡¡¡¡¡¡¡ ADD¡¡ AX, [SI]¡¡¡¡; add the array element¡¡¡¡
        ¡¡¡¡¡¡¡¡¡¡¡¡¡¡ ADD¡¡ SI, 2¡¡¡¡¡¡¡¡; 16bit data¡¡
        ¡¡¡¡¡¡¡¡¡¡¡¡¡¡ LOOP LOOP1¡¡¡¡
        ¡¡¡¡¡¡¡¡¡¡¡¡¡¡ POP¡¡ SI¡¡¡¡
        ¡¡¡¡¡¡¡¡¡¡¡¡¡¡ POP¡¡ BP¡¡¡¡
        ¡¡¡¡¡¡¡¡¡¡¡¡¡¡ RET¡¡¡¡
        _arrayadd ENDP¡¡¡¡
        ¡¡¡¡¡¡¡¡¡¡¡¡¡¡ END
        ¡¡
        • ÇÁ·Î±×·¥À» array2.asm À¸·Î ÀúÀå
        • tcc array.c array2.asm Çϸé
        • array.exe °¡ »ý¼ºµÊ
        • array.exe ½ÇÇà
      ¡¡
  • ½ºÅà µ¿ÀÛÀÇ ¼³¸í
    • ÇϳªÀÇ procedure ¿¡¼­ ´Ù¸¥ procedure ·Î ÆĶó¸ÞÅ͸¦ ³Ñ±â´Â ¹æ¹ýÁß Çϳª°¡ ½ºÅÃÀ» ÀÌ¿ëÇÑ ¹æ¹ýÀÌ´Ù
      ½ºÅÃÀ» ÀÌ¿ëÇÏ´Â ¹æ¹ýÀº call ÇÏ´Â procedure¿¡¼­ ³Ñ±æ ÆĶó¸ÞÅ͸¦ ½ºÅÿ¡ push ÇØÁÖ°í callµÈ procedure
      ¿¡¼­ ½ºÅÃÀ» access ÇÏ¿© ÀÌ ÆĶó¸ÞÅ͸¦ ÀÌ¿ëÇÑ´Ù.
      call µÈ procedure °¡ ³¡³¯À»¶§ call ÇÑ procedure ·Î return ÇϱâÀ§ÇÏ¿© return ÇÒ ÁÖ¼Òµµ ½ºÅÿ¡ ³Ö¾îÁø´Ù.
      ÀϹÝÀûÀ¸·Î call ÇÏ´Â ¹æ¹ýÀº call µÇ´Â procedure °¡ °°Àº ¼¼±×¸ÕÆ®¾È¿¡ ÀÖ´Â °æ¿ì (Áï NEAR type À¸·Î
      procedure °¡ ¼±¾ðµÈ°æ¿ì) ¿Í ´Ù¸¥ ¼¼±×¸ÕÆ®¿¡ Àִ°æ¿ì (Áï FAR type À¸·Î procedure °¡ ¼±¾ðµÈ °æ¿ì)
      °¡ ÀÖ´Ù. NEAR type ÀÏ °æ¿ì´Â call µÇ´Â procedure °¡ °°Àº ¼¼±×¸ÕÆ® ¾È¿¡ ÀÖÀ½À¸·Î IP ¸¸ ÀúÀåÇÏ¸é µÇ°í
      FAR type ÀÎ °æ¿ì call µÇ´Â procedure °¡ ´Ù¸¥ ¼¼±×¸ÕÆ®¾È¿¡ ÀÖÀ½À¸·Î CS:IP ¸ðµÎ¸¦ ÀúÀåÇؾ߸¸ ÇÑ´Ù.
      ±×·¯¹Ç·Î call µÇ´Â procedure °¡ NEAR À̸é IP ¸¸ ÀúÀåµÇ°í, FAR À̸é CS:IP °¡ ÀúÀåµÈ´Ù.
      ÀÌ·¯ÇÑ Â÷ÀÌ´Â call µÈ procedure ¿¡¼­ ÆĶó¸ÞÅ͸¦ °¡Á®¿Ã¶§ÀÇ offset ÁÖ¼Ò°¡ ¹Ù²ñÀ¸·Î ÁÖÀÇÇÏ¿©¾ß¸¸ ÇÑ´Ù.

      ¿¹) À§ ¿¹2 ¸¦ ÀÌ¿ëÇÑ ½ºÅà µ¿ÀÛ (NEAR ÀÏ°æ¿ì)

      (C ÇÁ·Î±×·¥¿¡¼­ call Çϱâ Á÷ÀüÀÇ ½ºÅÃ)
      ¡¡
      (C ¿¡¼­ ÆĶó¸ÞÅ͸¦ ³Ñ°ÜÁÖ´Â ¸ð½À --- µÞÆĶó¸ÞÅͺÎÅÍ ½ºÅÿ¡ ³Ö´Â´Ù)
      (Assembly ÇÁ·Î±×·¥¿¡¼­ÀÇ ½ºÅÃÀÇ ¸ð½À, BP °ªÀÇ º¯È­¸¦ ¸·±âÀ§ÇØ PUSH ÇÏ°í POP ÇÑ´Ù)
      (½ºÅÿ¡¼­ ÆĶó¸ÞÅ͸¦ °¡Á®¿À´Â ¸ð½À)
      ¸¸¾à FAR type À¸·Î ¼±¾ðµÈ procedure ¶ó¸é MOV¡¡¡¡ DX, [BP+6] À» ÅëÇÏ¿© x °ªÀ» °¡Á®¿À°í, MOV¡¡¡¡ DX, [BP+8]
      À» ÅëÇÏ¿© y °ªÀ» °¡Á®¿Â´Ù.
      ÀÌ´Â ½ºÅÿ¡ IP »Ó¸¸ ¾Æ´Ï¶ó CS µµ µé¾î°¡±â ¶§¹®ÀÌ´Ù.