C언어 복습(디버깅, 어셈블리 소스 작성)
// 두 수의 세제곱의 합을 구하는 프로그램(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로)
'내장형 하드웨어 > C언어' 카테고리의 다른 글
C언어 복습 5(token, strncpy, strtok, 디버깅) (0) | 2011.06.17 |
---|---|
C언어 복습 (문자열 복사 함수) (0) | 2011.06.16 |
ATmega128 spec2, C언어 복습2(디버깅) (1) | 2011.06.14 |
구조체(typedef, struct), 연결리스트 (1) | 2011.05.12 |
함수 포인터(function pointer), 배열 (0) | 2011.05.09 |