다음 함수는 3개의 인자를 받습니다( ex. %d, %c, %d)
그러고 case문 처럼 첫번째 인자값으로 다른 주소로 이동한뒤
세번째 인자값을 어떤 숫자와 비교하고, 값이 같으면 두번째 인자도 비교,
모두 일치하면 다음 단계로 통과하는 함수입니다.
중요한 구문에는 주석으로 실행과정을 보이겠습니다.
중요한건 제가 제일 마지막에 두번째 인자를 비교하는 과정을 잘 이해 못하고있습니다...
이부분에 대해서는 마지막에 다시 언급하겠습니다.
일단 코드를 보시죠...
(일단 이 함수를 탈출하기 위한 입력값은 "4, d, 220" 입니다)
08048f56 <phase_3>:
8048f56: 55 push %ebp
8048f57: 89 e5 mov %esp,%ebp
8048f59: 83 ec 38 sub $0x38,%esp
8048f5c: 8d 45 ec lea -0x14(%ebp),%eax
8048f5f: 89 44 24 10 mov %eax,0x10(%esp)
8048f63: 8d 45 f7 lea -0x9(%ebp),%eax
8048f66: 89 44 24 0c mov %eax,0xc(%esp)
8048f6a: 8d 45 f0 lea -0x10(%ebp),%eax
8048f6d: 89 44 24 08 mov %eax,0x8(%esp)
8048f71: c7 44 24 04 4b 9c 04 movl $0x8049c4b,0x4(%esp) // 이 위까지는 세팅부분 입니다
8048f78: 08
8048f79: 8b 45 08 mov 0x8(%ebp),%eax
8048f7c: 89 04 24 mov %eax,(%esp)
8048f7f: e8 00 f9 ff ff call 8048884 <__isoc99_sscanf@plt> //여기서 3개의 인자를 받아옵니다
8048f84: 83 f8 02 cmp $0x2,%eax //3단계를 뜻합니다. eax가 2보다 작으면 폭발
8048f87: 7f 05 jg 8048f8e <phase_3+0x38>
8048f89: e8 a3 06 00 00 call 8049631 <explode_bomb>
8048f8e: 83 7d f0 07 cmpl $0x7,-0x10(%ebp) //첫번째 인자가 7보다 크면 폭발(첫번째 인자는 0~7)
8048f92: 0f 87 fe 00 00 00 ja 8049096 <phase_3+0x140>
8048f98: 8b 45 f0 mov -0x10(%ebp),%eax
8048f9b: ff 24 85 60 9c 04 08 jmp *0x8049c60(,%eax,4) //첫번째 인자로 이동할 위치를 구합니다
8048fa2: b8 72 00 00 00 mov $0x72,%eax //eax가 0이면 이곳으로 이동, eax에는 0x72를 넣어줍니다
8048fa7: 81 7d ec 10 01 00 00 cmpl $0x110,-0x14(%ebp) // 3번째 인자와 0x110을 비교합니다
8048fae: 66 90 xchg %ax,%ax // 왜 하는지 모르겠음
8048fb0: 0f 84 f1 00 00 00 je 80490a7 <phase_3+0x151> // 비교값이 참이면 결과쪽으로 이동
8048fb6: e8 76 06 00 00 call 8049631 <explode_bomb> //거짓이면 폭발
8048fbb: b8 72 00 00 00 mov $0x72,%eax
8048fc0: e9 e2 00 00 00 jmp 80490a7 <phase_3+0x151>
8048fc5: 81 7d ec 27 03 00 00 cmpl $0x327,-0x14(%ebp)
8048fcc: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi
8048fd0: 0f 84 cc 00 00 00 je 80490a2 <phase_3+0x14c>
8048fd6: 66 90 xchg %ax,%ax
8048fd8: e8 54 06 00 00 call 8049631 <explode_bomb>
8048fdd: b8 70 00 00 00 mov $0x70,%eax
8048fe2: e9 c0 00 00 00 jmp 80490a7 <phase_3+0x151>
8048fe7: 81 7d ec 1c 02 00 00 cmpl $0x21c,-0x14(%ebp)
8048fee: 66 90 xchg %ax,%ax
8048ff0: 0f 84 ac 00 00 00 je 80490a2 <phase_3+0x14c>
8048ff6: 66 90 xchg %ax,%ax
8048ff8: e8 34 06 00 00 call 8049631 <explode_bomb>
8048ffd: b8 70 00 00 00 mov $0x70,%eax
8049002: e9 a0 00 00 00 jmp 80490a7 <phase_3+0x151>
8049007: b8 63 00 00 00 mov $0x63,%eax
804900c: 81 7d ec 03 03 00 00 cmpl $0x303,-0x14(%ebp)
8049013: 0f 84 8e 00 00 00 je 80490a7 <phase_3+0x151>
8049019: e8 13 06 00 00 call 8049631 <explode_bomb>
804901e: b8 63 00 00 00 mov $0x63,%eax
8049023: e9 7f 00 00 00 jmp 80490a7 <phase_3+0x151>
8049028: b8 64 00 00 00 mov $0x64,%eax //eax가 4이면 이곳으로 이동, eax에는 0x64를 넣어줍니다
804902d: 81 7d ec dc 00 00 00 cmpl $0xdc,-0x14(%ebp) //3번째 인자와 0xdc를 비교
8049034: 74 71 je 80490a7 <phase_3+0x151> //값이 같으면 이동
8049036: e8 f6 05 00 00 call 8049631 <explode_bomb> //다르면 폭발
804903b: b8 64 00 00 00 mov $0x64,%eax
8049040: eb 65 jmp 80490a7 <phase_3+0x151>
8049042: b8 73 00 00 00 mov $0x73,%eax
8049047: 81 7d ec 9e 00 00 00 cmpl $0x9e,-0x14(%ebp)
804904e: 66 90 xchg %ax,%ax
8049050: 74 55 je 80490a7 <phase_3+0x151>
8049052: e8 da 05 00 00 call 8049631 <explode_bomb>
8049057: b8 73 00 00 00 mov $0x73,%eax
804905c: eb 49 jmp 80490a7 <phase_3+0x151>
804905e: b8 77 00 00 00 mov $0x77,%eax
8049063: 81 7d ec 67 01 00 00 cmpl $0x167,-0x14(%ebp)
804906a: 74 3b je 80490a7 <phase_3+0x151>
804906c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi
8049070: e8 bc 05 00 00 call 8049631 <explode_bomb>
8049075: b8 77 00 00 00 mov $0x77,%eax
804907a: eb 2b jmp 80490a7 <phase_3+0x151>
804907c: b8 6a 00 00 00 mov $0x6a,%eax
8049081: 81 7d ec 0b 03 00 00 cmpl $0x30b,-0x14(%ebp)
8049088: 74 1d je 80490a7 <phase_3+0x151>
804908a: e8 a2 05 00 00 call 8049631 <explode_bomb>
804908f: b8 6a 00 00 00 mov $0x6a,%eax
8049094: eb 11 jmp 80490a7 <phase_3+0x151>
8049096: e8 96 05 00 00 call 8049631 <explode_bomb>
804909b: b8 63 00 00 00 mov $0x63,%eax
80490a0: eb 05 jmp 80490a7 <phase_3+0x151>
80490a2: b8 70 00 00 00 mov $0x70,%eax
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 이동한 주소는 모두 이 다음줄입니다.
80490a7: 3a 45 f7 cmp -0x9(%ebp),%al //2번째 인자와 al을 비교
80490aa: 74 09 je 80490b5 <phase_3+0x15f> //같으면 함수를 탈출합니다
80490ac: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi
80490b0: e8 7c 05 00 00 call 8049631 <explode_bomb> //다르면 폭발합니다
80490b5: c9 leave
80490b6: c3 ret
제가 궁금한것은 위에서 언급하듯이
2번째 인자는 \'d\'가 들어가고
위에서 \'d\'와 %al이 비교되는데
%al에는 \'0x64\'가 들어가있으니
\'d\'와 \'0x04\'가 비교되는것이 아닌가요?
정말 난해합니다...
이 코드를 해석해 주실 용자분 어디 없을까요...ㅜㅜ
댓글 영역
획득법
① NFT 발행
작성한 게시물을 NFT로 발행하면 일주일 동안 사용할 수 있습니다. (최초 1회)
② NFT 구매
다른 이용자의 NFT를 구매하면 한 달 동안 사용할 수 있습니다. (구매 시마다 갱신)
사용법
디시콘에서지갑연결시 바로 사용 가능합니다.