postgame


MS 비쥬얼스튜디오의 IDE 밑에는
gcc와 같은 진짜 컴파일러.. cl이 숨겨져 있습니다.

요 cl컴파일러의 옵션을 주면, c/c++ 소스를
어셈으로 변환시킬수가 있는데..
생각보다 간단합니다.

간단히 샘플을 만들어 해보겠습니다.

우선 새프로젝트에
콘솔응용프로그램, 옵션은 빈 프로젝트로 잡은후 
hello.c로 소스를 만듭니다.

  1. #include <stdio.h>
  2.  
  3. void sum(int a, int b)
  4. {
  5.     int j = a+b;
  6.     printf("%d\n",j);
  7. }
  8.  
  9. int main()
  10. {
  11.     sum(5,10);
  12. }


c로 소스를 만든건, c++는 네임맹글링 땜에 조금더 복잡하기 때문입니다.
어셈에 자신 있으신분들은 c++로 만들고 까보셔도 되구요.

그다음
Visual studio Tools >> 'Visual studio 명령 프롬프트'를 실행합니다.
(VS옵션에 있는게 아니라 같이 설치되는 바로가기에 있습니다.
명령프롬프트는 cl컴파일러의 경로설정이 다 되어있어서 편합니다.)

그리곤 hello.c가 있는 폴더로 가서


cl hello.c /FAs
라고 /FAs붙이고 치면 끝!

c소스에 어셈이 밑에 달리는 형태로
hello.asm이란 어셈파일을 만들어 줍니다.

제껀 아래처럼 나오네요

  1. ; Listing generated by Microsoft (R) Optimizing Compiler Version 15.00.30729.01
  2.  
  3.     TITLE   C:\Documents and Settings\xp\My Documents\Visual Studio 2008\Projects\hello\hello\hello.c
  4.     .686P
  5.     .XMM
  6.     include listing.inc
  7.     .model  flat
  8.  
  9. INCLUDELIB LIBCMT
  10. INCLUDELIB OLDNAMES
  11.  
  12. _DATA   SEGMENT
  13. $SG2473 DB  '%d', 0aH, 00H
  14. _DATA   ENDS
  15. PUBLIC  _sum
  16. EXTRN   _printf:PROC
  17. ; Function compile flags: /Odtp
  18. ; File c:\documents and settings\xp\my documents\visual studio 2008\projects\hello\hello\hello.c
  19. _TEXT   SEGMENT
  20. _j$ = -4                        ; size = 4
중략..

함수 호출하는 곳을 보면..

  1. ; 11   :    sum(5,10);
  2.  
  3.     push    10                  ; 0000000aH
  4.     push    5
  5.     call    _sum
  6.     add esp, 8
  7.  

sum(5,10)에서 파라미터 뒤에서 부터 10, 5 씩 스택에 푸쉬하고
sum함수를 호출하는 것을 알 수 있습니다.
호출 후에는 esp에 8(4byte + 4byte)을 증가시켜서
push된 데이터를 없애는 것도 알 수 있습니다.

사실.. 좀 더 편한 방법으론..
그냥 적당한 곳에다가 브레이크를 걸고,
alt + 8을 눌러서 어셈소스를 보는 방법도 있습니다.


하지만, 이방법은 디버깅용으로 구성된 어셈 소스가 나오니,
 공부하기엔 깔끔하진 못하네요.
위에 mov eax, 0CCCCCCCCCh 같은건 모두 디버깅용으로 삽입된 소스입니다.

하지만,  FAs처럼
10(0Ah),5를 push하고 esp에 8을 증가시키는 것 똑같죠?
Posted by 중원_