본문 바로가기

컴퓨터 과학 & 영상처리 관련/Visual Studio

비주얼 스튜디오에서 어셈블리어 코드 얻기

프로젝트 -> 프로젝트 속성 -> 구성속성 -> c/c++ -> 출력파일 -> 어셈블러 출력 -> 어셈블리, 기계어 코드, 소스(/FAcs)


이렇게 선택하면 *.cod 파일이 생성되고 거기에 이것저것..담겨있는 어셈블리어 담겨있드라...

 

 

(명령어..이거 pdf 못구하나?)

 


인텔 기반 컴퓨터를 위한 어셈블리 언어 vol.5"이걸 추천 해요 ㅋㅋ

KIP R.RIVINE 지음, 박명순,윤상균 옮김

 

아래 링크에서 pdf 파일 조지면 나올듯

 

111.xps

 

http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html

 

 

http://www.intel.com/design/literature.htm

 

 

 

 

 

 

 

 

 

Assembly Language for Intel-Based Computers

 

 

출처 : http://cafe.daum.net/itbankcafe/Gpr4/28?docid=oTPO|Gpr4|28|20100105001424&q=%BA%F1%C1%D6%BE%F3%BD%BA%C6%A9%B5%F0%BF%C0%20%BE%EE%BC%C0%BA%ED%B8%AE%BE%EE

 

비주얼 스튜디오에서 어셈블리어 코드 얻기

 

글. 오상문  sualchi@daum.net


 

시스템 프로그래머나 어셈블리어를 아는 프로그래머는 특정한 목적을 위해

C나 C++ 코드를 어셈블리어 코드로 변환하여 살펴보곤 한다. 일반적으로 최적화나

디버깅을 위해 이런 작업을 한다.

 

비주얼C++ 환경에서 어셈블리어 코드를 얻는 방법은 다음과 같다. 일단 대상 파일을

연 상태이어야 한다(프로젝트 오픈). 그렇지 않으면 옵션 설정이 안 된다.

 

(1) Project->Settings->C/C++ 탭을 선택한다.

(2) 왼쪽 창의 소스 리스트에서 원하는 CPP 파일을 선택한다.

     ([+] 버튼을 누르면 하위 목록이 나타납니다.)

(3) Category:를 Listing Files로 선택합니다.

(4) Listing file type:을 Assembly with Source Code로 선택한다.

(5) OK 버튼을 누른다.

(6) 컴파일(빌드)을 한다.

(7) 프로젝트 디렉터리에 있는 Debug 디렉터리에서 확장자가 asm인 파일을 찾는다. 

(8) 파일을 선택해서 메모장이나 편집기로 읽어서 살펴본다.

   

 

<예> 윈도우 콘솔 프로젝트 "demo"에 있는 demo.cpp 소스 코드에 대한

       어셈블리어 소스 파일을 얻고 싶다면 ...

 

<소스 리스트>

// Demo.cpp : ... console application.
//

#include "stdafx.h"

int main(int argc, char* argv[])
{
 printf("Hello World!\n");
 return 0;
}


 

앞에서 설명한 프로젝트 설정을 따라 한다. 단, 대상 파일은 Demo.cpp 파일을 선택한다.

프로젝트 개발 모드는 Debug 모드라고 가정하므로 그렇게 설정하기 바란다.

 

빌드한 적이 없다면 빌드를 해주고, 아닌 경우에는 demo.cpp 파일만 컴파일 한다.

이제 Debug 디렉토리에 가면 Demo.asm 파일이 있을 텐데 그 파일을 메모장 등에서

읽어서 살펴본다.

 

참고로 어셈블리어 코드에서 ; 로 시작하는 줄은 설명문(주석문)에 해당한다.

설명문에 C/C++ 소스 코드가 적힌 것을 볼 수 있는데, 그 소스와 관련된(그것을 번역한)

어셈블리어 코드는 그 아래 줄들에 나타난다. 

 

예를 들어 printf() 함수를 사용한 원래 코드가 아래와 이렇다면

 

; 8    :  printf("Hello World!\n");

 

이것에 대한 어셈블리어 변환 코드는 다음처럼 그 아래에 나타난다.

 

 push OFFSET FLAT:??_C@_0O@FEEI@Hello?5World?$CB?6?$AA@ ; `string'
 call _printf
 add esp, 4

 

 

<출력된 asm 파일 내용>

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

 TITLE D:\예제\Demo\Demo.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
$$SYMBOLS SEGMENT BYTE USE32 'DEBSYM'
$$SYMBOLS ENDS
$$TYPES SEGMENT BYTE USE32 'DEBTYP'
$$TYPES ENDS
_TLS SEGMENT DWORD USE32 PUBLIC 'TLS'
_TLS ENDS
; COMDAT ??_C@_0O@FEEI@Hello?5World?$CB?6?$AA@
CONST SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST 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
PUBLIC ??_C@_0O@FEEI@Hello?5World?$CB?6?$AA@  ; `string'
EXTRN _printf:NEAR
EXTRN __chkesp:NEAR
; COMDAT ??_C@_0O@FEEI@Hello?5World?$CB?6?$AA@
; File D:\예제\Demo\Demo.cpp
CONST SEGMENT
??_C@_0O@FEEI@Hello?5World?$CB?6?$AA@ DB 'Hello World!', 0aH, 00H ; `string'
CONST ENDS
; COMDAT _main
_TEXT SEGMENT
_main PROC NEAR     ; COMDAT

; 7    : {

 push ebp
 mov ebp, esp
 sub esp, 64     ; 00000040H
 push ebx
 push esi
 push edi
 lea edi, DWORD PTR [ebp-64]
 mov ecx, 16     ; 00000010H
 mov eax, -858993460    ; ccccccccH
 rep stosd

; 8    :  printf("Hello World!\n");

 push OFFSET FLAT:??_C@_0O@FEEI@Hello?5World?$CB?6?$AA@ ; `string'
 call _printf
 add esp, 4

; 9    :  return 0;

 xor eax, eax

; 10   : }

 pop edi
 pop esi
 pop ebx
 add esp, 64     ; 00000040H
 cmp ebp, esp
 call __chkesp
 mov esp, ebp
 pop ebp
 ret 0
_main ENDP
_TEXT ENDS
END
-------------------------------------------------------------------

* 굵게 표시한 부분은 설명문(주석문)이다.

 

[참고] 원래 프로젝트 이름과 cpp 파일 이름이 "1"인데 그것을 "Demo"로 변경하였다.