블로그 이미지
하루, 글. 그림. 영상매체. 표현을 도와주는 기기들. 도전 중. 동화다아아
    동화다아아

    카테고리

    분류 전체보기 (176)
    잡담 (1)
    IT 기기-리뷰&뉴스 (7)
    리뷰 - 도서 (1)
    리뷰 - 영상 (0)
    리뷰 - 그림/음악 (1)
    내장형 하드웨어 (163)
    Total
    Today
    Yesterday
     

    // 두 수의 세제곱의 합을 구하는 프로그램(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로)

    Posted by 동화다아아
    , |

    최근에 달린 댓글

    최근에 받은 트랙백

    글 보관함