2011년6월15일_어셈블리어로 작성된 코드(함수, 프로시저)를 C코드에서 호출

 

★C언어는 그래픽분야와 달리 공부한 성과가 잘 나타나지 않는다. 어느 순간 깨달아 성과가 나오니 시간을 많이 투자하자..
★어릴 때 부터 주입된 기억은 구분하지 못 한다.

 

 

disassemble한 C Code를 살펴보기


   1:  // 임베디드C p.19  예제p1-5
   2:  // 두 수의 세제곱의 합을 구하는 프로그램
   3:  #include <stdio.h>
   4:   
   5:  int numsquare(int number);
   6:  int sum(int n1, int n2);
   7:  void print(int num);
   8:   
   9:  int main()
  10:  {
  11:      int iNum1;
  12:      int iNum2;
  13:      int iNum3;
  14:      int iSquare1;
  15:      int iSquare2;
  16:      int iSum_num;
  17:   
  18:      iNum1 = 3;
  19:      iNum2 = 5;
  20:   
  21:      iSquare1 = numsquare(iNum1);
  22:      iSquare2 = numsquare(iNum2);
  23:      iSum_num = iSquare1 + iSquare2;
  24:   
  25:      print(iSum_num);
  26:   
  27:      sum(1,2);      //sum함수를 사용하여 임의로 추가함.
  28:   
  29:      return 0;
  30:  }
  31:   
  32:   
  33:  int numsquare(int number)
  34:  {
  35:      return(number * number);
  36:  }
  37:   
  38:   
  39:  int sum(int n1, int n2)
  40:  {
  41:      return(n1 + n2);
  42:  }
  43:   
  44:   
  45:  void print(int num)
  46:  {
  47:      printf("The sum of square of two numbers is %d\n",num);
  48:  }

 


상기의 소스코드를 VS6.0에서 디버깅한다.


image 

sum( ) 함수의 return에서 F9키를 눌러 브레이크 포인트를 건 후…
F5키를 눌러 디버깅모드 진입한다.

 

image

disassembly된 Code를 보기 위해 메뉴 – Debug Windows - Disassembly를 클릭.

 

image

sum( )함수 내의 명령문 return( );이 본문이라 그 위와 아래에 있는 코드들은 C컴파일러가 자동으로 생성해주는 들러리격이다.

 

 

어셈블리어 작성

 

image

어셈블리어에선 인자, 반환값의 자료형이 없다. 
C언어에서만 자료형을 체크한다. (C언어 문법은 이렇게 저렇게 해야 된다는 제약이 많다.)

어셈블리어는 기계에 대해 잘 알아야 하니 프로그래머가 모두 알아서 해야된다.
int형 short형 char형 이렇게 있는게 아니라 1Byte, 2Bytes, 4Bytes 이렇게 계산하고 이동한다.
(후에 자세히)

 

image

C언어에서 return 100;과 같이 100이라는 값을 반환하려면,
어셈블리어에선 eax라는 32bit크기의 누산기(CPU 32bit)에 값을 넣기만 하면 된다.
이를 명령어로 표현하면,

mov eax, 100                  ; return 100; 과 같다.

 

 

어셈블 & 컴파일
실행


도스창에서,


image

> ml /c /coff sum2.asm을 입력하여 어셈블리어로 짠 소스를 컴파일하여 기계어 코드 obj파일로 바꾼다.

 

image

> cl /c main.c을 입력하여 C Code를 기계어 코드 obj파일로 바꾼다.

 

image

> cl main.obj sum2.obj

C Code에서 만들어진 기계어와 어셈블리어로 만들어진 기계어를 링크한다. (합체!)
만들어진 실행파일 main.exe를 실행하면,



image   sum1( )의 반환값을 출력하니 100이 표시된다.

 

(C Code에서 어셈블리어 Code로 인자전달은 나중에 시간나면 –_-;)

 

 

 

 

참조 (Reference)

 

DSCN3368 DSCN3369 DSCN3370

DSCN3371 DSCN3372