Como posso ver o código de montagem para um programa C ++?

133

Como posso ver o código de montagem para um programa C ++?

Quais são as ferramentas populares para fazer isso?

Nerd
fonte
Microsoft Visual C ++ Express apenas definir um ponto de interrupção e pressioneAlt +8
JYZ
Possível duplicata: stackoverflow.com/questions/137038/…
legends2k

Respostas:

167

Pergunte ao compilador

Se você estiver criando o programa você mesmo, poderá solicitar ao seu compilador para emitir a fonte do assembly. Para a maioria dos compiladores UNIX, use o -Scomutador.

  • Se você estiver usando o GNU assembler, a compilação -g -Wa,-alhfornecerá origem e montagem misturadas no stdout ( -Wasolicita ao driver do compilador que passe opções ao assembler, -alativa a listagem de montagens e -ahadiciona a lista de "fontes de alto nível"):

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

  • Para o Visual Studio, use /FAsc.

Espreitar o binário

Se você compilou binário,

Use seu depurador

Depuradores também podem aparecer desassociados.

Russo empregado
fonte
35

No GCC / G ++, compile com -S. Isso produzirá um something.sarquivo com o código de montagem.

Editar: se você deseja que a saída esteja na sintaxe da Intel (que é IMO, muito mais legível e a maioria dos tutoriais de montagem a utiliza), compile com -masm=intel.

Zifre
fonte
5
adicione também a -fverbose-asmopção
osgx
23

No Visual Studio ;

  1. definir um ponto de interrupção
  2. execute o programa até que ele pare no ponto de interrupção
  3. clique com o botão direito do mouse no código-fonte e escolha "mostrar desmontagem"
Viktor Sehr
fonte
14

Para gcc / g ++

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

Isso irá gerar prog.s com alguns comentários sobre variáveis ​​usadas em cada linha do asm:

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

Muitas pessoas já disseram como emitir código de montagem com um determinado compilador. Outra solução é compilar um arquivo de objeto e despejá-lo com uma ferramenta como objdump , readelf (no Unix) ou DUMPBIN ( link ) (no Windows). Você também pode despejar um executável, mas será mais difícil ler a saída.

Isso tem a vantagem de trabalhar da mesma maneira com qualquer compilador.

Bastien Léonard
fonte
6

Qualquer depurador que você estiver usando deve ter uma exibição de montagem (Visual Studio, Borland IDE, gdb, etc.). Se você não estiver usando um depurador e quiser apenas ver qual montagem está em um programa, poderá usar um desmontador ou, alternativamente, executar o programa e anexá-lo a um depurador e fazer o despejo a partir daí. Consulte as referências aos desmontadores para obter informações sobre as opções.

Adam Markowitz
fonte
5

Como outra pessoa mencionou, o depurador da sua plataforma é um bom ponto de partida. Para a britadeira de todos os depuradores e desmontadores, dê uma olhada IDA Pro.

Nas plataformas Unix / Linux (incluindo Cygwin), você pode usar objdump --disassemble <executable>.

Ori Pessach
fonte
Se houver uma opção para o compilador gerar o assembler (como gcc -S ou a opção VS / FA abaixo), isso é preferível à desmontagem. É mais simbólico.
Marco van de Voort
Claro, se você tem a fonte.
Ori Pessach
2
A propósito, você ficaria surpreso com a quantidade de informações de símbolos que o IDA Pro pode deduzir.
Ori Pessach
5

A maioria dos compiladores tem uma opção para gerar uma listagem de montagem. Por exemplo, com o VisualStudio você pode usar algo como:

cl.exe /FAfile.asm file.c

Para melhor legibilidade, porém, a maioria dos depuradores oferecerá uma visão que intercala a desmontagem com a fonte original, para que você possa comparar seu código com a linha de saída do compilador por linha.

Nik
fonte
3

Você também pode tentar este site: http://assembly.ynh.io/

Lá, você pode colar seu código C ou C ++ e pressionar um botão azul para ver a versão equivalente à montagem.

Gomes JA
fonte
FYI, deixando de carga
Kaiwan
Sim, em 2015 estava funcionando bem, e de repente parou. Depois veio o ctoassembly.com, mas funcionou apenas para um pequeno subconjunto de C. O mesmo aconteceu: não está mais carregando. Que pena.
Gomes JA
2

No Visual Studio, você pode gerar a listagem do assembler para um projeto C ++.

Vá para as propriedades do projeto, depois para C ++ / Output Files e defina a configuração de saída do assembler e o local da lista ASM como um nome de arquivo.

Cătălin Pitiș
fonte
1

Em um Intel Mac OS X 10.8 (Mountain Lion), a -masm=inteldiretiva não funcionou. No entanto, se você tiver o Xcode instalado, ele deverá ter instalado a ferramenta denominada 'otool':

otool code.o -tV

Você deve fornecer o código do objeto compilado como um parâmetro.

gibertoni
fonte
0

Se você é um usuário do Eclipse, pode usar a visualização Desmontagem .

A visualização Desmontagem mostra o programa carregado como instruções do assembler combinadas com o código fonte para comparação. A linha atualmente em execução é indicada por um marcador de seta e destacada na exibição. Você pode executar as seguintes tarefas na exibição Desmontagem:

  • Defina pontos de interrupção no início de qualquer instrução do assembler
  • Habilitar e desabilitar pontos de interrupção e definir suas propriedades
  • Siga as instruções de desmontagem do seu programa
  • Ir para instruções específicas no programa
Pieter
fonte
Você pode elaborar um pouco?
31514 Peter
Há também vista de montagem quando a depuração em MSVC
phuclv
Eu não tenho um ambiente de trabalho Eclipse C ++ desenvolvimento agora, mas aqui está a documentação oficial: help.eclipse.org/kepler/...
Pieter