Exemplos de expressão mista

Este tópico contém exemplos de expressões MASM e C++ que são usadas em vários comandos.

Todas as outras seções desta documentação da Ajuda usam a sintaxe de expressão MASM nos exemplos (salvo indicação em contrário). A sintaxe de expressão C++ é muito útil para manipular estruturas e variáveis, mas não analisa muito bem os parâmetros dos comandos do depurador.

Se você estiver usando comandos do depurador para fins gerais ou usando extensões do depurador, defina a sintaxe da expressão MASM como a sintaxe padrão, por exemplo, usando .expr (Choose Expression Evaluator). Se você precisar de um parâmetro específico para usar a sintaxe de expressão C++, use a sintaxe @@( ).

Se myInt for um valor ULONG32 e se você estiver usando o avaliador de expressão MASM, os dois exemplos a seguir mostrarão o valor de MyInt.

0:000> ?? myInt 
0:000> dd myInt L1 

No entanto, o exemplo a seguir mostra o endereço de myInt.

0:000> ? myInt 

Pontos de interrupção condicionais

Você pode usar operadores de comparação para criar pontos de interrupção condicionais. O exemplo de código a seguir usa a sintaxe de expressão MASM. Como o radix padrão atual é 16, o exemplo usa o prefixo 0n para que o número 20 seja entendido como um número decimal.

0:000> bp MyFunction+0x43 "j ( poi(MyVar)>0n20 ) ''; 'gc' " 

No exemplo anterior, MyVar é um inteiro na origem C. Como o analisador MASM trata todos os símbolos como endereços, o exemplo deve ter o operador poi para cancelar a referência a MyVar.

Expressões condicionais

O exemplo a seguir imprime o valor de ecx se eax for maior que ebx, 7 se eax for menor que ebx e 3 se eax for igual a ebx. Este exemplo usa o avaliador de expressão MASM, portanto, o sinal de igual (=) é um operador de comparação, não um operador de atribuição.

0:000> ? ecx*(eax>ebx) + 7*(eax<ebx) + 3*(eax=ebx) 

Na sintaxe C++, o sinal @ indica um registro, um sinal de igual duplo (==) é o operador de comparação e o código deve ser explicitamente convertido de BOOL em int. Portanto, na sintaxe C++, o comando anterior se torna o seguinte.

0:000> ?? @ecx*(int)(@eax>@ebx) + 7*(int)(@eax<@ebx) + 3*(int)(@eax==@ebx) 

Exemplos de expressões mistas MASM e C++

Não é possível usar expressões de linha de origem em uma expressão C++. O exemplo a seguir usa a sintaxe do avaliador alternativo @@( ) para aninhar uma expressão MASM em uma expressão C++. Este exemplo define MyPtr igual ao endereço da linha 43 do arquivo Myfile.c.

0:000> ?? MyPtr = @@( `myfile.c:43` )

Os exemplos a seguir definem o avaliador de expressão padrão como MASM e, em seguida, avaliam Expression2 como uma expressão C++ e avaliam Expression1 e Expression3 como expressões MASM.

0:000> .expr /s masm 
0:000> bp Expression1 + @@( Expression2 ) + Expression3 

Se myInt for um valor ULONG64 e se você souber que esse valor é seguido na memória por outro ULONG64, poderá definir um ponto de interrupção de acesso nesse local usando um dos exemplos a seguir. (Observe o uso da aritmética do ponteiro.)

0:000> ba r8 @@( &myInt + 1 ) 
0:000> ba r8 myInt + 8 

Confira também

Números e operadores MASM

Números e operadores C++

Expressões MASM x Expressões C++

Extensão de sinal