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]
받은 트랙백이 없고,
댓글이 없습니다.



글
댓글을 달아 주세요
댓글 RSS 주소 : http://www.cipher.pe.kr/tt/cipher/rss/comment/149댓글 ATOM 주소 : http://www.cipher.pe.kr/tt/cipher/atom/comment/149