Share via


Ejemplos de expresiones mixtas

En este tema se incluyen ejemplos de expresiones MASM y C++ que se usan en varios comandos.

Todas las demás secciones de esta documentación de Ayuda usan la sintaxis de expresiones MASM en los ejemplos (a menos que se indique lo contrario). La sintaxis de expresiones de C++ es muy útil para manipular estructuras y variables, pero no analiza muy bien los parámetros de los comandos del depurador.

Si usa comandos del depurador para fines generales o con extensiones del depurador, debe establecer la sintaxis de expresión MASM como sintaxis predeterminada, por ejemplo mediante .expr (Elegir evaluador de expresiones). Si debe tener un parámetro específico para usar la sintaxis de expresión de C++, use la sintaxis @@( ).

Si myInt es un valor de ULONG32 y si usa el evaluador de expresiones MASM, los dos ejemplos siguientes muestran el valor de MyInt.

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

Sin embargo, en el ejemplo siguiente se muestra la dirección de myInt.

0:000> ? myInt 

Puntos de interrupción condicionales

Puede usar operadores de comparación para crear puntos de interrupción condicionales. En el ejemplo de código siguiente se usa la sintaxis de expresión MASM. Dado que el radix predeterminado actual es 16, en el ejemplo se usa el prefijo 0n para que el número 20 se comprenda como un número decimal.

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

En el ejemplo anterior, MyVar es un entero en el origen de C. Dado que el analizador de MASM trata todos los símbolos como direcciones, el ejemplo debe tener el operador poi para desreferenciar MyVar.

Expresiones condicionales

En el ejemplo siguiente se imprime el valor de ecx si eax es mayor que ebx, 7 si eax es menor que ebx y 3 si eax es igual a ebx. En este ejemplo se usa el evaluador de expresiones MASM, por lo que el signo igual (=) es un operador de comparación, no un operador de asignación.

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

En la sintaxis de C++, el @ signo indica un registro, un signo igual doble (==) es el operador de comparación y el código debe convertir explícitamente de BOOL a int. Por lo tanto, en la sintaxis de C++, el comando anterior se convierte en el siguiente.

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

Ejemplos de expresiones mixtas de MASM y C++

No se pueden usar expresiones de línea de origen en una expresión de C++. En el ejemplo siguiente se usa la sintaxis del evaluador alternativo @@( ) para anidar una expresión MASM dentro de una expresión de C++. En este ejemplo se establece MyPtr igual a la dirección de la línea 43 del archivo Myfile.c.

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

En los ejemplos siguientes se establece el evaluador de expresiones predeterminado en MASM y, a continuación, se evalúa Expression2 como una expresión de C++ y se evalúa Expression1 y Expression3 como expresiones MASM.

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

Si myInt es un valor de ULONG64 y sabe que otro ULONG64 sigue este valor en memoria, puede establecer un punto de interrupción de acceso en esa ubicación mediante uno de los ejemplos siguientes. (Tenga en cuenta el uso de aritmética de puntero).

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

Consulte también

Números y operadores de MASM

Números y operadores de C++

Expresiones de MASM frente a expresiones de C++

Extensión de firma