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