C 코드를 어셈블리로 만들어서 보는 방법은 생각보다 간단하다. Visual C++ 6.0의 경우 셋팅만 바꾸면 바로 어셈블 코드를 볼 수 있으며, 주석으로 C 코드까지 포함시켜서 볼 수 있다. 다른 컴파일러의 예를 들기 위해서 MinGW gcc 3.2.3으로도 만들어 보았다.

Microsoft Visual C++ 6.0에서 만든 코드에서 46번째 줄에서 52까지를 필요한 stack을 전부 oxc로 채우는 것을 알 수 있다. 이 부분은 어떻게 보면 하나의 오버헤드이다. Visual C++ 6.0 컴파일러에 존재하는 것이다. 다른 버전의 컴파일러는 확인을 하지 못해서 단정 짖지 못한다.
 

아래 코드에서 DWORD는 4 byte를 말한다.

원본 C code

[code type=c]int main(void)
{
 int a = 100;
 int b = 200;
 int c;

 c = a + b;

 return 0;
}[/code]


Assemble code generated by MinGW gcc version 3.2.3
[code type=asm] .file "1520.c"
 .def ___main; .scl 2; .type 32; .endef
 .text
.globl _main
 .def _main; .scl 2; .type 32; .endef
_main:
 pushl %ebp
 movl %esp, %ebp
 subl $24, %esp
 andl $-16, %esp
 movl $0, %eax
 movl %eax, -16(%ebp)
 movl -16(%ebp), %eax
 call __alloca
 call ___main
 movl $100, -4(%ebp)
 movl $200, -8(%ebp)
 movl -8(%ebp), %eax
 addl -4(%ebp), %eax
 movl %eax, -12(%ebp)
 movl $0, %eax
 leave
 ret[/code]

-------------------

Assemble code generated by Visual C++ 6.0


 [code type=asm] TITLE D:\cipher\0524\1520\1520.c
 .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
$$SYMBOLS SEGMENT BYTE USE32 'DEBSYM'
$$SYMBOLS ENDS
$$TYPES SEGMENT BYTE USE32 'DEBTYP'
$$TYPES ENDS
_TLS SEGMENT DWORD USE32 PUBLIC 'TLS'
_TLS ENDS
; COMDAT _main
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
FLAT GROUP _DATA, CONST, _BSS
 ASSUME CS: FLAT, DS: FLAT, SS: FLAT
endif
PUBLIC _main
; COMDAT _main
_TEXT SEGMENT
_a$ = -4
_b$ = -8
_c$ = -12
_main PROC NEAR     ; COMDAT

; 2    : {

 push ebp
 mov ebp, esp
 sub esp, 76     ; 0000004cH
 push ebx
 push esi
 push edi

 

; 아래는 Visual C++에만 존재하는 stack 영역을 초기화 하는 부분이다.
 lea edi, DWORD PTR [ebp-76]
 mov ecx, 19     ; 00000013H
 mov eax, -858993460    ; ccccccccH
 rep stosd

; stack 영역을 초기화 하는 부분 끝

; 3    :  int a = 100;

 mov DWORD PTR _a$[ebp], 100   ; 00000064H

; 4    :  int b = 200;

 mov DWORD PTR _b$[ebp], 200   ; 000000c8H

; 5    :  int c;
; 6    :
; 7    :  c = a + b;

 mov eax, DWORD PTR _a$[ebp]
 add eax, DWORD PTR _b$[ebp]
 mov DWORD PTR _c$[ebp], eax

; 8    :
; 9    :  return 0;

 xor eax, eax

; 10   : }

 pop edi
 pop esi
 pop ebx
 mov esp, ebp
 pop ebp
 ret 0
_main ENDP
_TEXT ENDS
END[/code]

크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://www.cipher.pe.kr/tt/cipher/rss/response/149

댓글+트랙백 ATOM :: http://www.cipher.pe.kr/tt/cipher/atom/response/149

트랙백 주소 :: http://www.cipher.pe.kr/tt/cipher/trackback/149

트랙백 RSS :: http://www.cipher.pe.kr/tt/cipher/rss/trackback/149

트랙백 ATOM :: http://www.cipher.pe.kr/tt/cipher/atom/trackback/149

댓글을 달아 주세요

댓글 RSS 주소 : http://www.cipher.pe.kr/tt/cipher/rss/comment/149
댓글 ATOM 주소 : http://www.cipher.pe.kr/tt/cipher/atom/comment/149
[로그인][오픈아이디란?]