서명 확장
부속된 32비트 정수가 음수이면 가장 높은 비트는 1과 같습니다. 이 32비트 부호 있는 정수를 64비트 숫자로 캐스팅하면 상위 비트를 0으로 설정하거나(부호 없는 정수 및 숫자의 16진수 값을 유지) 높은 비트를 1로 설정할 수 있습니다(숫자의 부호 있는 값 유지). 후자의 상황을 기호 확장이라고 합니다.
디버거는 MASM 식, C++ 식 및 숫자를 표시할 때 기호 확장에 대한 다양한 규칙을 따릅니다.
MASM 식에서 확장 서명
특정 조건에서는 MASM 식 계산기에서 숫자가 자동으로 확장된 기호 가 됩니다. 서명 확장은 0x80000000 0xFFFFFFFF 숫자만 영향을 줄 수 있습니다. 즉, 부호 확장은 높은 비트가 1인 32비트로 작성할 수 있는 숫자에만 영향을 줍니다.
0x12345678 숫자는 디버거가 64비트 숫자로 처리할 때 항상 12345678 0x00000000 유지됩니다. 반면, 0x890ABCDE 64비트 값으로 처리되면 0x00000000'890ABCDE로 유지되거나 MASM 식 계산기가 0xFFFFFFFF'890ABCDE로 확장에 서명할 수 있습니다.
0x80000000 0xFFFFFFFF 숫자는 다음 조건에 따라 확장된 기호입니다.
숫자 상수는 사용자 모드에서 확장된 로그인하지 않습니다. 커널 모드에서 숫자 상수는 낮은 바이트 앞에 심각한 악센트()를 ` 포함하지 않는 한 부호가 확장됩니다. 예를 들어 커널 모드에서 EEAA1122 16진수 및 00000000EEAA1122 는 부호가 확장되지만 000000000'EEAA1122 및 0'EEAA1122 그렇지 않습니다.
32비트 레지스터는 두 모드에서 확장된 기호입니다.
의사 레지스터는 항상 64비트 값으로 저장됩니다. 평가될 때 확장된 서명이 아닙니다. 의사 레지스터에 값이 할당 되면 사용되는 식이 표준 C++ 조건에 따라 평가됩니다.
식의 개별 숫자 및 레지스터는 확장된 기호일 수 있지만 식 평가 중에 다른 계산은 확장된 기호가 없습니다. 따라서 다음 구문을 사용하여 숫자의 상위 비트를 마스킹하거나 등록할 수 있습니다.
( 0x0`FFFFFFFF & expression )
C++ 식에서 확장 서명
디버거가 C++ 식을 평가하면 다음 규칙이 적용됩니다.
레지스터 및 의사 레지스터는 확장된 서명이 없습니다.
다른 모든 값은 C++가 해당 형식의 값을 처리하는 것과 똑같이 처리됩니다.
Sign-Extended 및 64비트 숫자 표시
32비트 및 16비트 레지스터를 제외한 모든 숫자는 디버거 내에서 내부적으로 64비트 값으로 저장됩니다. 그러나 숫자가 특정 조건을 충족하는 경우 디버거는 명령 출력에서 32비트 숫자로 표시합니다.
디버거는 다음 조건을 사용하여 숫자를 표시하는 방법을 결정합니다.
숫자의 높은 32비트 모두 0인 경우(즉, 숫자가 0x00000000'00000000에서 0x00000000'FFFFFFFF)인 경우 디버거는 숫자를 32비트 숫자로 표시합니다.
숫자의 높은 32비트를 모두 사용하고 낮은 32비트의 가장 높은 비트가 하나인 경우(즉, 숫자가 0xFFFFFFFF'80000000에서 0xFFFFFFFF'FFFFFFFF까지인 경우) 디버거는 숫자가 기호 확장 32비트 숫자라고 가정하고 32비트 숫자로 표시합니다.
이전 두 조건이 적용되지 않는 경우(즉, 숫자가 0x00000001'00000000~0xFFFFFFFF'7FFFFFFF)인 경우 디버거는 숫자를 64비트 숫자로 표시합니다.
이러한 표시 규칙 때문에 숫자가 0x80000000~0xFFFFFFFF 32비트 숫자로 표시되는 경우 높은 32비트 모두 0인지 확인할 수 없습니다. 이러한 두 경우를 구분하려면 숫자(예: 하나 이상의 상위 비트 마스킹 및 결과 표시)에 대한 추가 계산을 수행해야 합니다.