내장형 하드웨어/C언어

C언어 복습(디버깅, 어셈블리 소스 작성)

동화다아아 2011. 6. 15. 16:07
 

// 두 수의 세제곱의 합을 구하는 프로그램(p1_5.c)

#include<stdio.h>

int numsquare(int number);

int sum(int n1, int n2);

void print(int num);


int main()

{

        int num1;

        int num2;

        int num3;

        int square1;

        int square2;

        int sum_num;


        num1 = 3;

        num2 = 5;

        square1 = numsquare(num1);

        square2 = numsquare(num2);

        sum_num = square1 + square2;

        print(sum_num);


        num3 = sum1(0,0);

        printf("sum1 return value %d\n", num3);


        return 0;

}

int numsquare(int number)

{

        return (number * number);

}

int sum(int n1, int n2)

{

        return (n1+n2);

}

void print(int num)

{

        printf("The sum of square of two number is %d\n", num);

}

⇒ 출력 화면

 

 004010C0   push        ebp

 004010C1   mov         ebp,esp

entry code

stack 보호(처리)

 004010E2   mov         esp,ebp

 004010E4   pop         ebp

 004010E5   ret

exit code


어셈블리 코드로 작성

.386

; 386 이상의 버전을 사용하겠다.(호환성을 고려), 앞의 ‘.’은 어셈블러에게 지시의 의미

.MODEL FLAT ; 메모리 형태(메모리 모델은 FLAT(순차적)이다.)

 

PUBLIC _sum1 ; ‘_(언더바)’를 붙이지 않으면 C에서 볼 수 없다.

               ; 바깥에서 접근 가능하게 하기 위해 PUBLIC을 붙여야 한다.

 

.code ; 코드 영역 시작(여기서부터 함수를 만들겠다는 뜻.)

          _sum1 PROC NEAR32

     ; PROC은 함수를 뜻한다.(procedure) 즉, 함수의 시작을 나타낸다.(sum1의 시작)

     ; NEAR32는 근처의 32bit를 사용한다는 뜻.

                    push ebp 

                    mov ebp, esp

 

                    mov eax, 100 ; eax에 100을 집어넣는다. (100을 반환한다.)

 

                    mov esp, ebp

                    pop ebp

                    ret

    

          _sum1 ENDP ; 함수의 끝을 나타낸다.

END ; 소스가 끝났음을 의미한다.


⇒ ml /c /coff sum1.asm

 → Assembling: sum1.asm

⇒ 어셈블리는 함수의 인자나 반환형이 없다.

⇒ 대소문자를 구분하지 않는다.

⇒ 주석은 ‘;(세미콜론)’ 을 붙여 작성한다.


⇒ p1_5.c 와 sum1의 obj 파일을 각각 생성해서 링크시켜 하나의 실행파일을 만든다.

 → cl /c p1_5 (p1_5 파일의 obj 파일 생성)

 → cl p1_5.obj sum1.obj (두 obj 파일을 링크 시킨다.)

 → p1_5 (실행)


⇒ 출력화면

 


⇒ p1_5에서 sum1(1, 2);로 고치면

 

 

 

 

 

 

 

 

1000

 

 

 

1004

old ebp

 

 ebp

 

1008

ret

 

 

 

1

 +8

  mov eax, dword ptr[ebp+8]

 

 

2

 +12

  mov eax, dword ptr[ebp+12]


⇒ stack은 메모리에 있고 그것을 더하거나 하려면 한 개 이상의 값을 메모리에서 CPU로 불러와야 한다.

⇒ mov eax, dword ptr[ebp+8]

   add = eax, dword ptr[ebp+12]

 → eax 에는 1이 들어가 있다.(CPU로)