반응형
#include <stdio.h>
int main(void)
{
int i = 0;
int sum = 0;
for(i=0; i<10; i++)
{
sum += i;
}
printf("%d, %d\n", i, sum);
return 0;
}
위의 사진이 main() 함수 부분이다.
int i = 0;
int sum = 0;
위의 부분이 main() 함수에서 변수 초기화 부분에 해당한다.
그리고는 40157E 주소로 점프한다.
40156B 주소의 명령까지 실행되고 난 후 스택의 상황은 위와 같다.
RBP의 주소는 61FE20으로 rbp-4(61FE1C), rbp-8(61FE18) 각 주소부터 4byte의 공간을 0으로 초기화한다.
for(i=0; i<10; i++)
{
sum += i;
}
위의 부분이 main() 함수에서 for문 부분이다.
rbp-4 주소에서부터 4byte 공간에는 0이 담겨있다.
- rbp-4 주소에 있는 값을 eax에 담고
- rbp-8 주소에 eax 값을 담는다.
- rbp-4 주소에 있는 값에 1을 더한다.
- 1을 더한 rbp-4의 값과 9를 비교하여 9보다 작으면 401574 주소로 점프하여 1번 순서부터 다시 반복한다.
- 1을 더한 rbp-4의 값이 9보다 작지 않으면 401582 주소의 명령은 건너뛴다.
printf("%d, %d\\n", i, sum);
위의 부분이 main() 함수에서 printf() 함수 호출 부분이다.
rbp-8 주소에 있는 값과 rbp-4에 있는 값을 각각 edx, eax 레지스터에 담고, edx의 값을 r8d에 담은 뒤 edx에 eax의 값을 담는다.
즉, rbp-8 주소에 있는 값은 r8d 레지스터에 넣고, rbp-4 주소에 있는 값은 edx 레지스터에 넣는 것이다.
그리고 rcx에는 “%d, %d\n”이라는 문자열을 넣고
printf() 함수를 호출한다.
참고)
Windows 64bit 환경에서는 함수의 인자를 차례대로 rcx, rdx, r8, r9에 넣고 추가적인 인자들은 스택에 넣은 뒤 함수를 호출한다.
위의 사진은 printf() 함수를 호출하기 바로 직전의 레지스터들의 상태이다.
추가적으로 404000 주소에는 위와 같이 “%d, %d” 문자열이 들어있다.
반응형
'C > C note' 카테고리의 다른 글
[C Note] WinAPI/MFC _TCHAR, _tmain, _tprint, L””, TEXT(), _T() (0) | 2022.08.24 |
---|---|
[C Note] 비전공자들을 위한 알아두면 좋은 프로그램과 C언어 기본 개념 (0) | 2022.08.22 |
[C 언어] while문 process(with Assembly) (0) | 2022.06.30 |
[C 언어] if문, strlen() 함수, strcmp() 함수 process(with Assembly) (0) | 2022.06.30 |
[C Note]_tmain(), main(), wmain() 차이점 (0) | 2021.01.29 |