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


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.


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.


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"

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  #


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.


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.


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>.


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.



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.


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.


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.


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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.