태그 보관물: disassembly

disassembly

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

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

이를 위해 가장 많이 사용되는 도구는 무엇입니까?



답변

컴파일러에게 물어보기

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

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

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

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

바이너리로 엿보기

바이너리를 컴파일했다면

디버거 사용

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


답변

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

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


답변

Visual Studio에서 ;

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

답변

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  #


답변

이 사이트는 현재 나를 위해 일하고 있습니다 (2017) : https://godbolt.org/


답변

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

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


답변

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