다음을 통해 공유


혼합 식 예제

이 항목에는 다양한 명령에 사용되는 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 연산자가 있어야 합니다.

조건식

다음 예제에서는 eaxebx보다 크면 ecx 값을, eaxebx보다 작으면 7을, eaxebx와 같은 경우 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++ 식 비교

서명 확장