'inline'에 해당되는 글 1건

  1. 2006.08.14 :: [VC] 인라인 ASM 으로 작성한 연산 (1)
Computer_IT/C++ 2006.08.14 20:55
  1. #include "stdio.h"
  2. // EAX, EBX, ECX, EDX          : 32 bit
  3. // AX, BX, CX, DX                 : 16 bit
  4. // AH, AL, BH, BL, CH, CL, DH, DL :  8 bit
  5. void main()
  6. {
  7.        int addvar, pointvar1=5, pointvar2;
  8.        int *p=&pointvar1;
  9.        int cur = 1;
  10.        int test1 = 1, test2 = 10;
  11.        printf("The Size of (int)=%d Byte\n", sizeof(int));
  12.        printf("So, %d Bit\n\n", sizeof(int)*8);
  13.        __asm // 더하기 예제
  14.        {
  15.                MOV EAX, 10             // EAX = 10
  16.                MOV EBX, 20             // EBX = 20
  17.                ADD EAX, EBX           // EAX += EBX
  18.                MOV addvar, EAX       // addvar = EAX
  19.        }
  20.        printf("ADD Test Result=%d\n", addvar);
  21.        __asm // 빼기 예제
  22.        {
  23.                MOV EAX, 10           // EAX = 10
  24.                MOV EBX, 20           // EBX = 20
  25.                SUB EAX, EBX         // EAX += EBX
  26.                MOV addvar, EAX     // addvar = EAX
  27.        }
  28.        printf("SUB Test Result=%d\n", addvar);
  29.        __asm  // 포인터 사용 예제
  30.        {
  31.                MOV EAX, 10           // EAX = 10
  32.                MOV EBX, p             // EBX = p 
  33.                ADD EAX, [EBX]      // EAX += *EBX  -> [EAX]는 EAX의 주소가 가르키는 값 
  34.                MOV pointvar2, EAX  // pointvar2 = EAX         
  35.        }
  36.        printf("Pointer Test Result=%d\n", pointvar2);
  37.   __asm  // 비교분기 예제
  38.   {
  39.           CMP cur, 1    // if(cur==1)
  40.           JE go1          // goto go1
  41.          
  42.           CMP cur, 2    // if(cur==2)
  43.           JE go2          // goto go2
  44. go1:
  45.           MOV EAX, cur    // EAX = cur
  46.           ADD EAX, 100    // EAX += 100
  47.           MOV cur, EAX    // cur = EAX
  48. go2:
  49.           MOV EAX, cur    // EAX = cur
  50.           ADD EAX, 200    // EAX += 200
  51.           MOV cur, EAX    // cur = EAX
  52.   }
  53.   printf("Compare Test Result=%d\n", cur);
  54.   __asm // 증가 예제
  55.   {
  56.           MOV EAX, test1         // EAX = test1
  57.           INC EAX                   // EAX++
  58.           MOV test2, EAX         // test2 = EAX
  59.   }
  60.   printf("test1=%d, Increased test1=%d\n", test1, test2);
  61.   __asm // 감소 예제
  62.   {
  63.           MOV EAX, test1         // EAX = test1
  64.           DEC EAX                  // EAX-- 
  65.           MOV test2, EAX         // test2 = EAX
  66.   }
  67.   printf("test1=%d, decreased test1=%d\n", test1, test2);
  68.   __asm // 치환 예제
  69.   {
  70.           MOV EAX, test1      // EAX = test1
  71.           MOV EBX, test2      // EBX = test2
  72.           XCHG EAX, EBX     // swap EAX, EBX
  73.           MOV test1, EAX      // test1 = EAX
  74.           MOV test2, EBX      // test2 = EBX
  75.   }
  76.   printf("After XCHG : test1=%d, test2=%d\n", test1, test2);
  77. }

출력결과
The Size of (int)=4 Byte
So, 32 Bit
ADD Test Result=30
SUB Test Result=-10
Pointer Test Result=15
Compare Test Result=301
test1=1, Increased test1=2
test1=1, decreased test1=0
After XCHG : test1=0, test2=1
posted by 고급코드 고급코드