학부게시판에-_-..
"간만에 흥미로운 문제.. C관련입니다.ㅋㅋ"
라는 -0-...제목의 글이 올라와서..
보다가-_-...
less..
훔..;;
도저히 C언어만 봐서는 해결이 안나와서-_-
역어셈을 했습니다;..
간단하게-_-
1 #include
2 void main()
3 {
4 int a,sum;
5 sum=(++a) + (++a) + (++a)+ (++a);
6 printf("a=%d sum=%d
", a,sum);
7 }
이정도로만 코딩을 해서.......++a를 괄호로 묶은건..혹시나 하는 마음에-_-;;
직접 해 보고 싶으신 분들을 위해..
gcc -g problem.c -o problem
하면..디버깅 가능하게 컴파일 되구요..;
gdb ./problem
하면.....디버깅 가능합니다..
disas main
을 하게되면......main함수 부분이 어셈블리언어로 만들어져 나오구요..
그걸 대충 분석해봤습니다..;;
0x08048378 : push %ebp
0x08048379 : mov %esp,%ebp
0x0804837b : sub $0x18,%esp
0x0804837e : and $0xfffffff0,%esp
0x08048381 : mov $0x0,%eax
0x08048386 : add $0xf,%eax
0x08048389 : add $0xf,%eax
0x0804838c : shr $0x4,%eax
0x0804838f : shl $0x4,%eax
0x08048392 : sub %eax,%esp
0x08048394 : lea 0xfffffff8(%ebp),%eax EBP는 변수 a가 저장되는 장소정도로 생각 a를 eax레지스터에 저장
0x08048397 : incl (%eax) 해서 ++a이므로 1증가.(a=4)
0x08048399 : lea 0xfffffff8(%ebp),%eax 다시 a의 값을 가져와서
0x0804839c : incl (%eax) 1증가 ( a = 5 )
0x0804839e : mov 0xfffffff8(%ebp),%eax
0x080483a1 : mov 0xfffffff8(%ebp),%edx
0x080483a4 : add %eax,%edx a+a = 10
0x080483a6 : lea 0xfffffff8(%ebp),%eax
0x080483a9 : incl (%eax) 다시 a를 가져와서 1증가 ( a = 6 )
0x080483ab : add 0xfffffff8(%ebp),%edx a+a+a = 16
0x080483ae : lea 0xfffffff8(%ebp),%eax
0x080483b1 : incl (%eax) 다시 1 증가 ( a = 7)
0x080483b3 : mov %edx,%eax
0x080483b5 : add 0xfffffff8(%ebp),%eax a+a+a+a = 23
0x080483b8 : mov %eax,0xfffffffc(%ebp)
0x080483bb : sub $0x4,%esp
0x080483be : pushl 0xfffffffc(%ebp)
0x080483c1 : pushl 0xfffffff8(%ebp)
0x080483c4 : push $0x80484cc
0x080483c9 : call 0x80482b0 <_init+56>
0x080483ce : add $0x10,%esp
0x080483d1 : leave
0x080483d2 : ret
설명이 좀 이상할지 몰라도-_-..머 대충;; a+a를 먼저 계산하는 과정에서..
연산자 우선순위에 의해서..a에 ++를 먼저 계산한거구요..
그래서 5+5가 됩니다;..4+5가 아닌-_-;;
뒤에는 차례대로 그냥 더해가는거죠;;..
---------------------060102추가-------------------
그냥 컴파일 할때
gcc -S -o problem.asm problem.c
라고 명령을 내리면...어셈블리 언어로 파일이 생성되네요;;..ㅋ
코드는 비슷하나..약간 다릅니다^^ㅋ;;
less..