티스토리 뷰

단순히 궁금증이 생겨서 비교해보았다.
노트 ㄱㄱ

아래는 .COD 파일을 생성해서 본 결과
    TITLE    d:\projects_svn\test_forloop\test_forloop.cpp
    .386P
include listing.inc
if @Version gt 510
.model FLAT
else
_TEXT    SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT    ENDS
_DATA    SEGMENT DWORD USE32 PUBLIC 'DATA'
_DATA    ENDS
CONST    SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST    ENDS
_BSS    SEGMENT DWORD USE32 PUBLIC 'BSS'
_BSS    ENDS
_TLS    SEGMENT DWORD USE32 PUBLIC 'TLS'
_TLS    ENDS
FLAT    GROUP _DATA, CONST, _BSS
    ASSUME    CS: FLAT, DS: FLAT, SS: FLAT
endif
PUBLIC    ?ret_printf@@YAHH@Z                ; 함수 ret_printf
EXTRN    _printf:NEAR
_DATA    SEGMENT
$SG579    DB    '%d', 0aH, 00H
_DATA    ENDS
_TEXT    SEGMENT
_i$ = 8
?ret_printf@@YAHH@Z PROC NEAR                ; ret_printf

; 8    : {

  00000    55         push     ebp
  00001    8b ec         mov     ebp, esp

; 9    :     return printf("%d\n", i);

  00003    8b 45 08     mov     eax, DWORD PTR _i$[ebp]
  00006    50         push     eax
  00007    68 00 00 00 00     push     OFFSET FLAT:$SG579
  0000c    e8 00 00 00 00     call     _printf
  00011    83 c4 08     add     esp, 8

; 10   : }

  00014    5d         pop     ebp
  00015    c3         ret     0
?ret_printf@@YAHH@Z ENDP                ; ret_printf
_TEXT    ENDS
PUBLIC    _main                              ; 함수 MAIN
_DATA    SEGMENT
$SG589    DB    '-> %d ', 00H
_DATA    ENDS
_TEXT    SEGMENT
_i$ = -4
_j$588 = -8
_main    PROC NEAR

; 13   : {

  00016    55         push     ebp
  00017    8b ec         mov     ebp, esp
  00019    83 ec 08     sub     esp, 8

; 14   :     for(int i = 0; i < MAX_PATH; i++)

  0001c    c7 45 fc 00 00
    00 00         mov     DWORD PTR _i$[ebp], 0
  00023    eb 09         jmp     SHORT $L585
$L586:
  00025    8b 45 fc     mov     eax, DWORD PTR _i$[ebp]
  00028    83 c0 01     add     eax, 1
  0002b    89 45 fc     mov     DWORD PTR _i$[ebp], eax
$L585:
  0002e    81 7d fc 04 01
    00 00         cmp     DWORD PTR _i$[ebp], 260    ; 00000104H
  00035    7d 22         jge     SHORT $L587

; 16   :         int j = ret_printf(i);

  00037    8b 4d fc     mov     ecx, DWORD PTR _i$[ebp]
  0003a    51         push     ecx
  0003b    e8 00 00 00 00     call     ?ret_printf@@YAHH@Z    ; ret_printf
  00040    83 c4 04     add     esp, 4
  00043    89 45 f8     mov     DWORD PTR _j$588[ebp], eax

; 17   :
; 18   :         printf("-> %d ", j);

  00046    8b 55 f8     mov     edx, DWORD PTR _j$588[ebp]
  00049    52         push     edx
  0004a    68 00 00 00 00     push     OFFSET FLAT:$SG589
  0004f    e8 00 00 00 00     call     _printf
  00054    83 c4 08     add     esp, 8

; 19   :     }

  00057    eb cc         jmp     SHORT $L586
$L587:

; 20   :
; 21   :     return 0;

  00059    33 c0         xor     eax, eax

; 22   : }

  0005b    8b e5         mov     esp, ebp
  0005d    5d         pop     ebp
  0005e    c3         ret     0
_main    ENDP
_TEXT    ENDS
END


아래는 release 빌드시 결과 파일에서 긁어온 내용
당연하지만, 최적화(Optimization)이 되어 있다.
.COD 가 소스(Source) 를 직역했다고 한다면,
아래의 코드는 의역을 했다고 생각할 수 있겠다.

[MAIN]
00401020  /$  56                    push esi

for(int i = 0; i < 260; i++) 에서 맨 처음이 당연히 LOOP에 들어가는 것이니까,
쓸데 없이 비교하는 루틴은 들어가지 않는다,
ESI 를 초기화 하고, 스택에 넣은 뒤 바로 CALL

00401021  |.  33F6                 xor esi,esi
00401023  |>  56                    push esi
00401024  |.  E8 D7FFFFFF     call release_.00401000
00401029  |.  83C4 04             add esp,4

함수 호출의 결과 (EAX)를 바로 스택에 넣고 다시 CALL

0040102C  |.  50                    push eax
0040102D  |.  68 34704000       push release_.00407034                         ;  ASCII "-> %d "
00401032  |.  E8 19000000       call release_.00401050
00401037  |.  83C4 08             add esp,8
0040103A  |.  46                    inc esi
0040103B  |.  81FE 04010000   cmp esi,104
00401041  |.^ 7C E0              jl short release_.00401023
00401043  |.  33C0                xor eax,eax
00401045  |.  5E                   pop esi
00401046  \.  C3                  retn

[ret_printf]
00401000  /$  8B4424 04         mov eax,ss:[esp+4]
00401004  |.  50                    push eax
00401005  |.  68 30704000       push release_.00407030                         ;  ASCII "%d",LF
0040100A  |.  E8 41000000      call release_.00401050
0040100F  |.  83C4 08            add esp,8
00401012  \.  C3                  retn

궁금증에서 한번 비교해보긴 했는데, 역시 별게 없었다.
'최적화로 인해 저렇게 바뀌는구나' 하는 감상 뿐... ㅋ
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
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
글 보관함