다음을 통해 공유


혼합 식 예제

이 항목에는 다양한 명령에 사용되는 MASM 및 C++ 식의 예가 포함되어 있습니다.

이 도움말 설명서의 다른 모든 섹션에서는 예제에서 MASM 식 구문을 사용합니다(달리 명시되지 않은 경우). C++ 식 구문은 구조 및 변수를 조작하는 데 매우 유용하지만 디버거 명령의 매개 변수를 잘 구문 분석하지는 않습니다.

일반적인 용도로 디버거 명령을 사용하거나 디버거 확장을 사용하는 경우 .expr(식 계산기 선택)을 사용하는 등 MASM 식 구문을 기본 구문으로 설정해야 합니다. C++ 식 구문을 사용하려면 특정 매개 변수가 있어야 하는 경우 @@( ) 구문을 사용합니다.

myInt가 ULONG32 값이고 MASM 식 계산기를 사용하는 경우 다음 두 예제에서는 MyInt값을 보여 줍니다.

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

그러나 다음 예제에서는 myInt주소를 보여줍니다.

0:000> ? myInt 

조건부 중단점

비교 연산자를 사용하여 조건부 중단점을 만들 수 있습니다. 다음 코드 예제에서는 MASM 식 구문을 사용합니다. 현재 기본 반지름은 16이므로 이 예제에서는 0n 접두사를 사용하여 숫자 20을 10진수로 인식합니다.

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

이전 예제 에서 MyVar 는 C 원본의 정수입니다. MASM 파서는 모든 기호를 주소로 처리하므로 예제에는 MyVar를 역참조할 poi 연산자가 있어야 합니다.

조건식

다음 예제에서는 eax가 ebx보다 크면 ecx, eax가 ebx보다 작으면 7, eax가 ebx인 경우 3을 출력합니다. 이 예제에서는 MASM 식 계산기를 사용하므로 등호(=)는 대입 연산자가 아닌 비교 연산자입니다.

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

C++ 구문 @ 에서 기호는 레지스터를 나타내고 이중 등호(==)는 비교 연산자이며 코드는 BOOL에서 int명시적으로 캐스팅되어야 합니다. 따라서 C++ 구문에서 이전 명령은 다음과 같습니다.

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

MASM 및 C++ 혼합 식 예제

C++ 식에서는 소스 줄 식을 사용할 수 없습니다. 다음 예제에서는 @@( ) 대체 계산기 구문을 사용하여 C++ 식 내에 MASM 식을 중첩합니다. 다음은 MyPtr을 Myfile.c 파일의 줄 43 주소와 동일하게 설정하는 예제입니다.

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

다음 예제에서는 기본 식 계산기를 MASM으로 설정한 다음 Expression2를 C++ 식으로 평가하고 Expression1Expression3을 MASM 식으로 평가합니다.

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

myInt가 ULONG64 값이고 이 값이 메모리에서 다른 ULONG64 뒤에 오는 것을 알고 있는 경우 다음 예제 중 하나를 사용하여 해당 위치에서 액세스 중단점을 설정할 수 있습니다. (포인터 산술 연산을 사용합니다.)

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

참고 항목

MASM 번호 및 연산자

C++ 숫자 및 연산자

MASM 식과 C++ 식 비교

서명 확장