C ++ 프로그램의 어셈블리 코드를 어떻게 볼 수 있습니까?


답변:


167

컴파일러에게 물어보기

프로그램을 직접 빌드하는 경우 컴파일러에게 어셈블리 소스를 방출하도록 요청할 수 있습니다. 대부분의 UNIX 컴파일러에는 -S스위치를 사용하십시오 .

  • GNU 어셈블러를 사용하는 경우 컴파일 -g -Wa,-alh하면 stdout에 혼합 소스 및 어셈블리가 제공됩니다 ( -Wa컴파일러 드라이버에게 옵션을 어셈블러에 전달 -al하고 어셈블리 목록을 켜고 -ah"고수준 소스"목록을 추가하도록 요청).

    g++ -g -c -Wa,-alh foo.cc

  • Visual Studio의 경우을 사용하십시오 /FAsc.

바이너리로 엿보기

바이너리를 컴파일했다면

디버거 사용

디버거도 분해하여 표시 할 수 있습니다.


35

GCC / G ++에서로 컴파일하십시오 -S. something.s어셈블리 코드가 있는 파일 이 출력됩니다 .

편집 : 출력을 Intel 구문 (IMO, 훨씬 더 읽기 쉽고 대부분의 어셈블리 자습서에서 사용)으로 사용하려면으로 컴파일하십시오 -masm=intel.


5
-fverbose-asm옵션 추가
osgx

23

Visual Studio에서 ;

  1. 중단 점을 설정
  2. 중단 점에서 멈출 때까지 프로그램을 실행하십시오.
  3. 소스 코드를 마우스 오른쪽 버튼으로 클릭하고 "dissasembly 표시"를 선택하십시오.

14

gcc / g ++

gcc -save-temps -fverbose-asm prog.c

모든 asm 행에 사용 된 변수에 대한 주석과 함께 prog.s가 생성됩니다.

    movl    $42, -24(%ebp)  #, readme
    movl    -16(%ebp), %eax # pid, pid
    movl    %eax, 4(%esp)   # pid,
    movl    $.LC0, (%esp)   #,
    call    printf  #


6

많은 사람들이 이미 주어진 컴파일러로 어셈블리 코드를 생성하는 방법을 말했습니다. 또 다른 해결책은 객체 파일을 컴파일하고 objdump , readelf (UNIX) 또는 DUMPBIN ( link ) (Windows) 와 같은 도구로 덤프하는 것입니다 . 실행 파일을 덤프 할 수도 있지만 출력을 읽기가 더 어렵습니다.

이는 모든 컴파일러와 동일한 방식으로 작업 할 수 있다는 이점이 있습니다.


6

어떤 디버거를 사용하든 어셈블리 뷰 (Visual Studio, Borland IDE, gdb 등)가 있어야합니다. 디버거를 사용하지 않고 프로그램에 어떤 어셈블리가 있는지 확인하려는 경우 디스어셈블러를 사용하거나 프로그램을 실행하고 디버거로 첨부하여 덤프를 수행 할 수 있습니다. 옵션에 대한 정보는 디스어셈블러에 대한 참조를 참조하십시오 .


5

다른 사람이 언급했듯이 플랫폼의 디버거는 좋은 출발점입니다. 모든 디버거 및 디스어셈블러의 착암기에 대해서는 IDA Pro를 살펴보십시오 .

Unix / Linux 플랫폼 (Cygwin 포함)에서는을 사용할 수 있습니다 objdump --disassemble <executable>.


컴파일러에서 어셈블러를 생성하도록하는 옵션이있는 경우 (gcc -S 또는 아래 VS / FA 옵션), 디스 어셈블리보다 선호됩니다. 더 상징적입니다.
Marco van de Voort

물론, 소스가 있다면.
Ori Pessach

2
그건 그렇고, IDA Pro가 얼마나 많은 심볼 정보를 추론 할 수 있는지에 놀랄 것입니다.
Ori Pessach

5

대부분의 컴파일러에는 어셈블리 목록을 출력하는 옵션이 있습니다. 예를 들어 VisualStudio를 사용하면 다음과 같은 것을 사용할 수 있습니다.

cl.exe /FAfile.asm file.c

그러나 최고의 가독성을 위해 대부분의 디버거는 원본 소스와 디스 어셈블리를 인터리브하는 뷰를 제공하므로 코드를 컴파일러의 출력과 한 줄씩 비교할 수 있습니다.



3

이 사이트를 시험해 볼 수도 있습니다 : http://assembly.ynh.io/

여기에서 C 또는 C ++ 코드를 붙여넣고 파란색 버튼을 눌러 어셈블리에 해당하는 버전을 볼 수 있습니다.


참고로,로드 실패
kaiwan

예, 2015 년에 다시 작동했지만 갑자기 중단되었습니다. 그런 다음 ctoassembly.com이 왔지만 C의 작은 하위 집합에서만 작동했습니다. 더 이상로드되지 않습니다. 너무 나쁘다.
Gomes JA

2

Visual Studio에서는 C ++ 프로젝트에 대한 어셈블러 목록을 생성 할 수 있습니다.

프로젝트 속성으로 이동 한 다음 C ++ / 출력 파일로 이동하여 어셈블러 출력 설정 및 ASM 목록 위치를 파일 이름으로 설정하십시오.


1

Intel Mac OS X 10.8 (Mountain Lion)에서는 -masm=intel지시문이 작동하지 않았습니다. 그러나 Xcode 가 설치되어 있으면 'otool'이라는 도구가 설치되어 있어야합니다.

otool code.o -tV

컴파일 된 객체 코드를 매개 변수로 제공해야합니다.


0

Eclipse 사용자 인 경우 디스 어셈블리보기를 사용할 수 있습니다 .

디스 어셈블리보기는로드 된 프로그램을 비교하기 위해 소스 코드와 혼합 된 어셈블러 명령어로 표시합니다. 현재 실행중인 선은 화살표 마커로 표시되고 뷰에서 강조 표시됩니다. 분해보기에서 다음 작업을 수행 할 수 있습니다.

  • 어셈블러 명령어 시작시 중단 점 설정
  • 중단 점 활성화 및 비활성화 및 속성 설정
  • 프로그램의 분해 지침을 단계별로 수행하십시오.
  • 프로그램의 특정 지침으로 이동

좀 더 정교하게 할 수 있습니까?
피터 Mortensen

MSVC에서 디버깅 할 때 어셈블리 뷰도 있습니다
phuclv

현재 작동중인 Eclipse C ++ 개발 환경이 없지만 공식 문서는 다음과 같습니다. help.eclipse.org/kepler/…
Pieter
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.