반응형

for.exe
0.05MB

 

#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이 담겨있다.

 

  1. rbp-4 주소에 있는 값을 eax에 담고
  2. rbp-8 주소에 eax 값을 담는다.
  3. rbp-4 주소에 있는 값에 1을 더한다.
  4. 1을 더한 rbp-4의 값과 9를 비교하여 9보다 작으면 401574 주소로 점프하여 1번 순서부터 다시 반복한다.
  5. 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” 문자열이 들어있다.

반응형

+ Recent posts