Ejemplos de expresiones mixtas
Estos temas contienen ejemplos de expresiones MASM y C++ que se usan en varios comandos.
En todas las demás secciones de esta documentación de ayuda se usa la sintaxis de expresión 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 usa 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 expresiones MASM. Dado que la base predeterminada actual es 16, en el ejemplo se usa el prefijo 0n para que el número 20 se interprete 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 de dos iguales (==) 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 alternativa del evaluador @@( ) 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 si sabe que este valor va seguido de la memoria por otro ULONG64, 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 punteros).
0:000> ba r8 @@( &myInt + 1 )
0:000> ba r8 myInt + 8