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: }
sum( ) 함수의 return에서 F9키를 눌러 브레이크 포인트를 건 후…
F5키를 눌러 디버깅모드 진입한다.
disassembly된 Code를 보기 위해 메뉴 – Debug Windows - Disassembly를 클릭.
sum( )함수 내의 명령문 return( );이 본문이라 그 위와 아래에 있는 코드들은 C컴파일러가 자동으로 생성해주는 들러리격이다.
어셈블리어 작성 |
어셈블리어에선 인자, 반환값의 자료형이 없다.
C언어에서만 자료형을 체크한다. (C언어 문법은 이렇게 저렇게 해야 된다는 제약이 많다.)
어셈블리어는 기계에 대해 잘 알아야 하니 프로그래머가 모두 알아서 해야된다.
int형 short형 char형 이렇게 있는게 아니라 1Byte, 2Bytes, 4Bytes 이렇게 계산하고 이동한다.
(후에 자세히)
C언어에서 return 100;과 같이 100이라는 값을 반환하려면,
어셈블리어에선 eax라는 32bit크기의 누산기(CPU 32bit)에 값을 넣기만 하면 된다.
이를 명령어로 표현하면,
mov eax, 100 ; return 100; 과 같다.
어셈블 & 컴파일
|
도스창에서,
> ml /c /coff sum2.asm을 입력하여 어셈블리어로 짠 소스를 컴파일하여 기계어 코드 obj파일로 바꾼다.
> cl /c main.c을 입력하여 C Code를 기계어 코드 obj파일로 바꾼다.
> cl main.obj sum2.obj
C Code에서 만들어진 기계어와 어셈블리어로 만들어진 기계어를 링크한다. (합체!)
만들어진 실행파일 main.exe를 실행하면,
(C Code에서 어셈블리어 Code로 인자전달은 나중에 시간나면 –_-;)
참조 (Reference) |