티스토리 뷰
1. Switch.exe 해석 및 코드 복원
2. Switch2.exe 해석 및 코드 복원
3. while.exe 해석 및 코드 복원
4. for.exe 해석 및 코드 복원
1. Switch.exe 해석 및 코드 복원
[ 명령어의 의미 - Switch.exe ]
01321040 /$ 55 PUSH EBP ; 프롤로그 - 스택의 처음 위치 설정
01321041 |. 8BEC MOV EBP,ESP ; 프롤로그 - 스택의 마지막 위치 설정
01321043 |. 83EC 08 SUB ESP,8
01321046 |. C745 F8 0100>MOV DWORD PTR SS:[EBP-8],1 ; [EBP-8]의 주소에 1을 저장
0132104D |. 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8] ; EAX 에 [EBP-8]의 주소 값을 저장
01321050 |. 8945 FC MOV DWORD PTR SS:[EBP-4],EAX ; [EBP-4]의 주소에 EAX 값을 저장
01321053 |. 837D FC 00 CMP DWORD PTR SS:[EBP-4],0 ; [EBP-4]와 0 대소비교
01321057 |. 74 0E JE SHORT Switch.01321067 ; [EBP-4]가 0과 같으면 "0을 입력했습니다.\n"로 점프
01321059 |. 837D FC 01 CMP DWORD PTR SS:[EBP-4],1 ; [EBP-4]와 1 대소비교
0132105D |. 74 17 JE SHORT Switch.01321076 ; [EBP-4]가 1과 같으면 "1을 입력했습니다.\n"로 점프
0132105F |. 837D FC 02 CMP DWORD PTR SS:[EBP-4],2 ; [EBP-4]와 2 대소비교
01321063 |. 74 20 JE SHORT Switch.01321085 ; [EBP-4]가 2와 같으면 "2를 입력했습니다.\n"로 점프
01321065 |. EB 2D JMP SHORT Switch.01321094 ; 조건없이 "해당사항 없음\n"으로 점프
01321067 |> 68 F0203201 PUSH Switch.013220F0 ; "0을 입력했습니다.\n"를 스택에 저장
0132106C |. E8 3F000000 CALL Switch.013210B0 ; printf 함수 호출
01321071 |. 83C4 04 ADD ESP,4
01321074 |. EB 2B JMP SHORT Switch.013210A1 ; 조건없이 return 0;로 점프 (break;에 해당)
01321076 |> 68 04213201 PUSH Switch.01322104 ; "1을 입력했습니다.\n"를 스택에 저장
0132107B |. E8 30000000 CALL Switch.013210B0 ; printf 함수 호출
01321080 |. 83C4 04 ADD ESP,4
01321083 |. EB 1C JMP SHORT Switch.013210A1 ; 조건없이 return 0;로 점프 (break;에 해당)
01321085 |> 68 18213201 PUSH Switch.01322118 ; "2를 입력했습니다.\n"를 스택에 저장
0132108A |. E8 21000000 CALL Switch.013210B0 ; printf 함수 호출
0132108F |. 83C4 04 ADD ESP,4
01321092 |. EB 0D JMP SHORT Switch.013210A1 ; 조건없이 return 0;로 점프 (break;에 해당)
01321094 |> 68 2C213201 PUSH Switch.0132212C ; "해당사항 없음\n"을 스택에 저장
01321099 |. E8 12000000 CALL Switch.013210B0 ; printf 함수 호출
0132109E |. 83C4 04 ADD ESP,4
013210A1 |> 33C0 XOR EAX,EAX ; return 0;
013210A3 |. 8BE5 MOV ESP,EBP ; 에필로그
013210A5 |. 5D POP EBP ; 에필로그 - 스택의 처음 위치 해제
013210A6 \. C3 RETN ; 에필로그 - 함수를 호출한 지점으로 돌아감 (종료)
[EBP-8]을 num으로, [EBP-4]을 num2로 변수를 선언하여 코드로 복원했다.
2. Switch2.exe 해석 및 코드 복원
[ 명령어의 의미 - Switch2.exe ]
011B1040 /$ 55 PUSH EBP ; 프롤로그 - 스택의 처음 위치 설정
011B1041 |. 8BEC MOV EBP,ESP ; 프롤로그 - 스택의 마지막 위치 설정
011B1043 |. 83EC 08 SUB ESP,8
011B1046 |. C745 F8 0100>MOV DWORD PTR SS:[EBP-8],1 ; [EBP-8]의 주소에 1을 저장
011B104D |. 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8] ; EAX 에 [EBP-8]의 주소 값을 저장
011B1050 |. 8945 FC MOV DWORD PTR SS:[EBP-4],EAX ; [EBP-4]의 주소에 EAX의 값을 저장
011B1053 |. 837D FC 03 CMP DWORD PTR SS:[EBP-4],3 ; [EBP-4]와 3 대소비교
011B1057 |. 77 46 JA SHORT Switch2.011B109F ; [EBP-4]가 3보다 크면 "해당사항 없음\n"으로 점프
011B1059 |. 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4]
011B105C |. FF248D B4101>JMP DWORD PTR DS:[ECX*4+11B10B4] ; 조건없이 [ECX*4+11B10B4]로 점프
011B1063 |> 68 00301B01 PUSH Switch2.011B3000 ; "0을 입력했습니다.\n"를 스택에 저장
011B1068 |. E8 63000000 CALL Switch2.011B10D0 ; printf 함수 호출
011B106D |. 83C4 04 ADD ESP,4
011B1070 |. EB 3A JMP SHORT Switch2.011B10AC ; 조건없이 return 0;로 점프 (break;에 해당)
011B1072 |> 68 14301B01 PUSH Switch2.011B3014 ; "1을 입력했습니다.\n"를 스택에 저장
011B1077 |. E8 54000000 CALL Switch2.011B10D0 ; printf 함수 호출
011B107C |. 83C4 04 ADD ESP,4
011B107F |. EB 2B JMP SHORT Switch2.011B10AC ; 조건없이 return 0;로 점프 (break;에 해당)
011B1081 |> 68 28301B01 PUSH Switch2.011B3028 ; "2를 입력했습니다.\n"를 스택에 저장
011B1086 |. E8 45000000 CALL Switch2.011B10D0 ; printf 함수 호출
011B108B |. 83C4 04 ADD ESP,4
011B108E |. EB 1C JMP SHORT Switch2.011B10AC ; 조건없이 return 0;로 점프 (break;에 해당)
011B1090 |> 68 3C301B01 PUSH Switch2.011B303C ; "3을 입력했습니다.\n"를 스택에 저장
011B1095 |. E8 36000000 CALL Switch2.011B10D0 ; printf 함수 호출
011B109A |. 83C4 04 ADD ESP,4
011B109D |. EB 0D JMP SHORT Switch2.011B10AC ; 조건없이 return 0;로 점프 (break;에 해당)
011B109F |> 68 50301B01 PUSH Switch2.011B3050 ; "해당사항 없음\n"을 스택에 저장
011B10A4 |. E8 27000000 CALL Switch2.011B10D0 ; printf 함수 호출
011B10A9 |. 83C4 04 ADD ESP,4
011B10AC |> 33C0 XOR EAX,EAX ; return 0;
011B10AE |. 8BE5 MOV ESP,EBP ; 에필로그
011B10B0 |. 5D POP EBP ; 에필로그 - 스택의 처음 위치 해제
011B10B1 \. C3 RETN ; 에필로그 - 함수를 호출한 지점으로 돌아감 (종료)
Switch.exe와 Switch2.exe는 둘다 "1을 입력했습니다."가 출력되는 프로그램이다. Switch2.exe가 Switch.exe와 다른 점은 switch table을 생성한다는 것과 조건이 하나 더 추가되었다는 점이다.
Q. if문과 switch문은 유사해 보인다. 그렇다면 if문을 쓸지 switch문을 쓸지 고민될 때 아무거나 써도 될까?
대체로 그렇다. 하지만 둘 사이의 차이점은 존재한다. 조건이 3개 이하일 때에는 if문을 쓰는 것이 더 낫고, 조건이 4개 이상일 때에는 switch문을 쓰는 것이 더 낫다. 그 이유는 if문은 branch statement 기반이고, switch문은 jump statement 기반이기 때문이다. 쉽게 설명하자면, if문은 조건이 많아질수록 논리값이 참인지 거짓인지를 계속 판단해야 하기 때문에 효율성이 떨어진다. switch문의 경우 조건이 여러 개가 있어도 그 중 들어맞는 조건으로 jump하면 되므로 조건의 갯수가 실행 속도에 크게 영향을 미치지 않는다. 하지만 switch문은 초기에 switch table 생성 시 오버헤드가 발생하기 때문에 조건이 적을 때에는 if문보다 비효율적이다. 그리고, 모든 switch문은 if문으로 대체 가능하지만, 모든 if문이 switch문으로 대체될 수는 없다. (switch문 ⊂ if문)
* 오버헤드(Overhead) : 컴퓨터가 유저 프로그램을 실행할 때 직접 유저 프로그램처리를 하지 않는 부분
3. while.exe 해석 및 코드 복원
[ 명령어의 의미 - while.exe ]
00091040 /$ 55 PUSH EBP ; 프롤로그 - 스택의 처음 위치 설정
00091041 |. 8BEC MOV EBP,ESP ; 프롤로그 - 스택의 마지막 위치 설정
00091043 |. 83EC 08 SUB ESP,8
00091046 |. C745 FC 0100>MOV DWORD PTR SS:[EBP-4],1 ; [EBP-4]의 주소에 1을 저장 (초기값)
0009104D |. C745 F8 0000>MOV DWORD PTR SS:[EBP-8],0 ; [EBP-8]의 주소에 0을 저장
00091054 |> 837D FC 0A /CMP DWORD PTR SS:[EBP-4],0A ; [EBP-4]와 10 대소비교 (조건문)
00091058 |. 7D 14 |JGE SHORT while.0009106E ; [EBP-4]가 10 이상일 때 while문 밖으로 점프 (조건문)
0009105A |. 8B45 F8 |MOV EAX,DWORD PTR SS:[EBP-8] ; EAX 에 [EBP-8]의 주소 값 저장 ; [EBP-8] 변화
0009105D |. 0345 FC |ADD EAX,DWORD PTR SS:[EBP-4] ; EAX에 [EBP-4]의 주소 값을 더하는 연산 ; [EBP-8] 변화
00091060 |. 8945 F8 |MOV DWORD PTR SS:[EBP-8],EAX ; [EBP-8]의 주소 값에 EAX 값 저장 ; [EBP-8] 변화
00091063 |. 8B4D FC |MOV ECX,DWORD PTR SS:[EBP-4] ; ECX에 [EBP-4]의 주소 값 저장 ; [EBP-4] 변화
00091066 |. 83C1 01 |ADD ECX,1 ; ECX에 1을 더하는 연산 ; [EBP-4] 변화 (변화조건)
00091069 |. 894D FC |MOV DWORD PTR SS:[EBP-4],ECX ; [EBP-4]의 주소에 ECX 값 저장 ; [EBP-4] 변화
0009106C |.^EB E6 \JMP SHORT while.00091054 ; 조건없이 '조건문'으로 점프
0009106E |> 8B55 F8 MOV EDX,DWORD PTR SS:[EBP-8]
00091071 |. 52 PUSH EDX
00091072 |. 68 00300900 PUSH while.00093000 ; "%d "를 스택에 저장
00091077 |. E8 14000000 CALL while.00091090 ; printf 함수 호출
0009107C |. 83C4 08 ADD ESP,8
0009107F |. 33C0 XOR EAX,EAX ; return 0;
00091081 |. 8BE5 MOV ESP,EBP ; 에필로그
00091083 |. 5D POP EBP ; 에필로그 - 스택의 처음 위치 해제
00091084 \. C3 RETN ; 에필로그 - 함수를 호출한 지점으로 돌아감 (종료)
while.exe의 반복문에서 [EBP-4]는 반복 횟수이고, [EBP-8]은 더하기 연산을 반복해준 결과 값을 나타낸다.
※ 유한 횟수 만큼 반복되는 반복문은 항상 초기값, 조건문, 변화조건이 필요하다.
[EBP-4]를 loop로, [EBP-8]을 result로 변수를 설정하여 [그림 9]과 같이 코드를 복원할 수 있다. while.exe는 1부터 9까지의 숫자들의 합을 구하는 프로그램이다.
4. for.exe 해석 및 코드 복원
[ 명령어의 의미 - for.exe ]
00021080 /$ 55 PUSH EBP ; 프롤로그 - 스택의 처음 위치 설정
00021081 |. 8BEC MOV EBP,ESP ; 프롤로그 - 스택의 마지막 위치 설정
00021083 |. 83EC 0C SUB ESP,0C
00021086 |. A1 30300200 MOV EAX,DWORD PTR DS:[23030] ; 카나리 (메모리 보호기법)
0002108B |. 33C5 XOR EAX,EBP ; 카나리
0002108D |. 8945 FC MOV DWORD PTR SS:[EBP-4],EAX ; 카나리
00021090 |. 68 00300200 PUSH for.00023000 ; "숫자를 입력하시오 : "를 스택에 저장
00021095 |. E8 66000000 CALL for.00021100 ; printf 함수 호출
0002109A |. 83C4 04 ADD ESP,4
0002109D |. 8D45 F8 LEA EAX,DWORD PTR SS:[EBP-8]
000210A0 |. 50 PUSH EAX ; /Arg2
000210A1 |. 68 18300200 PUSH for.00023018 ; "%d"를 스택에 저장
000210A6 |. E8 95000000 CALL for.00021140 ; scanf 함수 호출
000210AB |. 83C4 08 ADD ESP,8
000210AE |. C745 F4 0100>MOV DWORD PTR SS:[EBP-C],1 ; [EBP-C]의 주소에 1을 저장 (초기값)
000210B5 |. EB 09 JMP SHORT for.000210C0 ; 조건없이 '조건문'으로 점프
000210B7 |> 8B4D F4 /MOV ECX,DWORD PTR SS:[EBP-C] ; ECX에 [EBP-C]의 주소 값 저장 ; [EBP-C] 변화
000210BA |. 83C1 01 |ADD ECX,1 ; ECX에 1을 더하는 연산 ; [EBP-C] 변화 (변화조건)
000210BD |. 894D F4 |MOV DWORD PTR SS:[EBP-C],ECX ; [EBP-C]의 주소에 ECX 값을 저장 ; [EBP-C] 변화
000210C0 |> 837D F4 0A CMP DWORD PTR SS:[EBP-C],0A ; [EBP-C]와 10 대소비교 (조건문)
000210C4 |. 7D 1F |JGE SHORT for.000210E5 ; [EBP-C]가 10 이상일 때 return 0;로 점프 (조건문)
000210C6 |. 8B55 F8 |MOV EDX,DWORD PTR SS:[EBP-8] ; EDX에 [EBP-8]의 주소 값을 저장
000210C9 |. 0FAF55 F4 |IMUL EDX,DWORD PTR SS:[EBP-C] ; EDX에 [EBP-C]의 주소 값을 곱하는 연산
000210CD |. 52 |PUSH EDX ; 네 번째 변수에 해당 (num * loop) ← [EBP-8] * [EBP-C]
000210CE |. 8B45 F4 |MOV EAX,DWORD PTR SS:[EBP-C] ; |
000210D1 |. 50 |PUSH EAX ; 세 번째 변수에 해당 (loop) ← [EBP-C]
000210D2 |. 8B4D F8 |MOV ECX,DWORD PTR SS:[EBP-8] ; |
000210D5 |. 51 |PUSH ECX ; 두 번째 변수에 해당 (num) ← [EBP-8]
000210D6 |. 68 1C300200 |PUSH for.0002301C ; "%d * %d = %d\n"를 스택에 저장
000210DB |. E8 20000000 |CALL for.00021100 ; printf 함수 호출
000210E0 |. 83C4 10 |ADD ESP,10
000210E3 |.^EB D2 \JMP SHORT for.000210B7 ; 조건없이 for문으로 점프
000210E5 |> 33C0 XOR EAX,EAX ; return 0;
000210E7 |. 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4] ; 카나리 (메모리 보호기법)
000210EA |. 33CD XOR ECX,EBP ; 카나리
000210EC |. E8 8A000000 CALL for.0002117B ; 카나리
000210F1 |. 8BE5 MOV ESP,EBP ; 에필로그
000210F3 |. 5D POP EBP ; 에필로그 - 스택의 처음 위치 해제
000210F4 \. C3 RETN ; 에필로그 - 함수를 호출한 지점으로 돌아감 (종료)
[EBP-8]을 num으로, [EBP-C]를 loop로 변수를 설정하여 코드를 복원했다.
- Total
- Today
- Yesterday
- bom
- gcc
- stdio.h
- long
- 리액트 #React #props #state #javascript
- short
- 변수
- c언어
- 자료형
- Navigator 객체
- Browser Object Model
- 키워드
- DOM
- window 객체
- 컴파일
- Document Object Model
- location 객체
- History 객체
- Screen 객체
- int
- keyword
- Char
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |