증감연산의 과정과 결과에 의문을 느껴서 정리해본다.
#include<stdio.h>
int main() {
int a=10;
printf("%d %d %d\n",a++,++a,++a);
printf("%d %d %d\n",a++,--a,a--);
return 0;
}
코드는 간단하게 위와 같고
gdb를 통해 간단한 디버깅을 해보았다.
일단 스택이라는 메모리 공간을 사용한다는 것을 알 수 있다.
프롤로그가 진행되고, printf("%d %d %d\n", a++,++a,++a); 의 인자는 뒤에서부터 스택에 쌓인다.
a값을 ebp-0x4라는 스택의 밑바닥에 저장하고 뒤의 인자 두개 ++a, ++a 전위연산을 add명령어를 통해 진행한다
10 -> 12가 된 ebp-0x4 값을 eax레지스터에 저장하고 후위 연산이 진행되는데, 후위 연산은 lea명령어가 쓰이는 것을 볼 수 있다.
12가 저장된 eax레지스터에 1을 더하여 그 주솟값을 edx레지스터에 lea명령어를 통해 전달한다
이후 printf의 인자값으로 esp+0x4 | esp+0x8 | esp+0xc 값이 전달되는데, 순차적으로 eax, edx, edx에 담겨있는 값을 전달한다.
결국 eax == 12, edx == 13 이므로
출력 결과를 확인할 수 있다.
텍스트로 정리하여 다소 난잡해졌지만 결론을 짓자면 증감연산에는 여러 레지스터가 사용되며 인자는 뒤에서부터 쌓이고 후위연산에는 lea가 사용되어 연산 전의 값을 담아둔 레지스터를 printf의 인자로 전달한다는 것, 전위 연산은 그 라인의 최종적인 변수값을 담은 레지스터를 인자로 전달한다는 것이다.
'보안 스터디 > c' 카테고리의 다른 글
[알고리즘] 퀵 정렬(Quick Sort) (0) | 2018.10.03 |
---|---|
[알고리즘] 유클리드 호제법 (0) | 2018.09.18 |