Partilhar via


Depuração no modo assembly

Se você tiver arquivos de origem C ou C++ para seu aplicativo, poderá usar o depurador com muito mais eficiência se depurar no modo de origem.

No entanto, há muitas vezes que você não pode executar a depuração de origem. Talvez você não tenha os arquivos de origem para seu aplicativo. Você pode estar depurando o código de outra pessoa. Talvez você não tenha criado seus arquivos executáveis com símbolos .pdb completos. E mesmo que você possa fazer a depuração de origem em seu aplicativo, talvez seja necessário rastrear as rotinas do Microsoft Windows que seu aplicativo chama ou que são usadas para carregar seu aplicativo.

Nessas situações, você precisa depurar no modo de assembly. Além disso, o modo de assembly tem muitos recursos úteis que não estão presentes na depuração de origem. O depurador exibe automaticamente o conteúdo dos locais de memória e os registros à medida que são acessados e exibe o endereço do contador do programa. Essa exibição torna a depuração de assembly uma ferramenta valiosa que você pode usar junto com a depuração de origem.

Código de desmontagem

O depurador analisa principalmente o código executável binário. Em vez de exibir esse código em formato bruto, o depurador desmonta esse código. Ou seja, o depurador converte o código de linguagem de computador em linguagem de assembly.

Você pode exibir o código resultante (conhecido como código de desmontagem) de várias maneiras diferentes:

  • O comando u (Unassemble) desmonta e exibe uma seção especificada do idioma do computador.

  • O comando uf (Função Unassemble) desmonta e exibe uma função.

  • O comando up (Unassemble from Physical Memory) desmonta e exibe uma seção especificada do idioma do computador que foi armazenada na memória física.

  • O comando (Unassemble Real Mode BIOS) desmonta e exibe um código de modo real de 16 bits especificado.

  • O comando ux (Unassemble x86 BIOS) desmonta e exibe o conjunto de instruções de código BIOS baseado em x86 em um endereço especificado.

  • (Somente WinDbg) A janela desmontada desmonta e exibe uma seção especificada do idioma do computador. essa janela estará ativa automaticamente se você selecionar o comando abrir desmontagem automaticamente no menu da janela . Você também pode abrir essa janela selecionando desmontagem no menu de exibição, pressionando alt+7 ou pressionando o botão desmontagem (alt+7).

A exibição de desmontagem aparece em quatro colunas: deslocamento de endereço, código binário, mnemônico da linguagem de assembly e detalhes da linguagem do assembly. O exemplo a seguir mostra essa exibição.

0040116b    45          inc         ebp            
0040116c    fc          cld                        
0040116d    8945b0      mov         eax,[ebp-0x1c] 

À direita da linha que representa o contador do programa atual, a exibição mostra os valores de quaisquer locais de memória ou registros que estão sendo acessados. Se essa linha contiver uma instrução de ramificação, a notação [br=1] ou [br=0] será exibida. Essa notação indica um branch que é ou não é usado, respectivamente.

Você pode usar o comando .asm (Alterar Opções de Desmontagem) para alterar como as instruções desmontadas são exibidas.

Na janela Desmontagem do WinDbg, a linha que representa o contador do programa atual é realçada. As linhas em que os pontos de interrupção são definidos também são realçadas.

Você também pode usar os seguintes comandos para manipular o código do assembly:

  • O comando # (Pesquisar Padrão de Desmontagem) pesquisa uma região de memória em busca de um padrão específico. Esse comando é equivalente a pesquisar as quatro colunas da exibição desmontada.

  • O comando a (Assemble) pode receber instruções de assembly e convertê-las em código de computador binário.

Modo de assembly e modo de origem

O depurador tem dois modos de operação diferentes: modo de assembly e modo de origem.

Quando você está percorrendo um aplicativo, o tamanho de uma única etapa é uma linha de código de assembly ou uma linha de código-fonte, dependendo do modo .

Vários comandos criam diferentes exibições de dados, dependendo do modo .

No WinDbg, a janela Desmontagem é movida automaticamente para o primeiro plano quando você executa ou percorre um aplicativo no modo de assembly. No modo de origem, a janela Origem é movida para o primeiro plano.

Para definir o modo, você pode fazer um dos seguintes procedimentos:

  • Use o comando l+, l- (Definir Opções de Origem) para controlar o modo. O comando l-t ativa o modo de assembly.

  • (Somente WinDbg) Desmarque o comando Modo de Origem no menu Depurar para fazer com que o depurador entre no modo de assembly. Você também pode selecionar o botão Modo de origem desativado na barra de ferramentas.

No WinDbg, quando você está no modo de assembly, o ASM aparece visível na barra de status.

O menu de atalho na janela Desmontagem do WinDbg inclui as instruções realçar do comando de linha de origem atual . Esse comando realça todas as instruções que correspondem à linha de origem atual. Frequentemente, uma única linha de origem corresponde a várias instruções de assembly. Se o código tiver sido otimizado, essas instruções de assembly poderão não ser consecutivas. O comando Realçar instruções da linha de origem atual permite que você encontre todas as instruções que foram montadas a partir da linha de origem atual.

Arquivos de origem da linguagem assembly

Se o aplicativo foi escrito em linguagem de assembly, a desmontagem que o depurador produz pode não corresponder exatamente ao código original. Em particular, NO-OPs e comentários não estarão presentes.

Se você quiser depurar seu código referenciando os arquivos .asm originais, deverá usar a depuração do modo de origem. Você pode carregar o arquivo de assembly como um arquivo de origem C ou C++. Para obter mais informações sobre esse tipo de depuração, consulte Depuração no modo de origem.