Поделиться через


Расширение sign

Если 32-разрядное целое число со знаком отрицательное, его самый высокий бит равен единице. Если это 32-разрядное целое число со знаком приводится к 64-разрядному числу, высокие биты могут быть равными нулю (сохраняя целое число без знака и шестнадцатеричное значение числа), или высокие биты могут быть равны одному (сохраняя значение со знаком числа). Последняя ситуация называется расширением знака.

Отладчик следует различным правилам для расширения знака в выражениях MASM, в выражениях C++, а также при отображении чисел.

Расширение входа в выражениях MASM

При определенных условиях вычислитель выражений MASM автоматически подписывает числа. Расширение знака может влиять только на числа от 0x80000000 до 0xFFFFFFFF. То есть расширение знака влияет только на числа, которые могут быть записаны в 32 бита с высоким битом, равным 1.

Число 0x12345678 всегда остается 0x00000000 12345678, когда отладчик обрабатывает его как 64-разрядное число. С другой стороны, если 0x890ABCDE рассматривается как 64-разрядное значение, оно может оставаться 0x00000000'890ABCDE или вычислитель выражений MASM может подписать расширение до 0xFFFFFFFF'890ABCDE.

Число от 0x80000000 до 0xFFFFFFFF расширяется на основе следующих критериев:

  • Числовые константы никогда не расширяются в пользовательском режиме. В режиме ядра числовая константа расширяется, если она не содержит серьезный акцент ( ` ) перед низкими байтами. Например, в режиме ядра шестнадцатеричные числа EEAA1122 и 00000000EEAA1122 являются расширенными, но 000000000'EEAA1122 и 0'EEAA1122 — нет.

  • 32-разрядный регистр расширяется в обоих режимах.

  • Псевдорегистры всегда хранятся в виде 64-разрядных значений. При оценке они не расширяются. Когда псевдорегистрару присваивается значение, используемое выражение оценивается в соответствии со стандартными критериями C++.

  • Отдельные числа и регистры в выражении могут быть расширены знаками, но никакие другие вычисления во время вычисления выражения не являются расширенными знаками. В результате можно маскировать большие биты числа или регистрировать с помощью следующего синтаксиса.

    ( 0x0`FFFFFFFF & expression )
    

Расширение sign в выражениях C++

Когда отладчик вычисляет выражение C++, применяются следующие правила:

  • Регистры и псевдорегистры никогда не расширяются.

  • Все остальные значения обрабатываются точно так же, как в C++ для значений своего типа.

Отображение Sign-Extended и 64-разрядных чисел

Кроме 32-разрядных и 16-разрядных регистров, все числа хранятся внутри отладчика в виде 64-разрядных значений. Однако если число удовлетворяет определенным критериям, отладчик отображает его в виде 32-разрядного числа в выходных данных команды.

Отладчик использует следующие критерии для определения способа отображения чисел:

  • Если высокие 32 бита числа являются нулями (то есть, если число от 0x00000000'000000000 до 0x00000000'FFFFFFFF), отладчик отображает это число в виде 32-разрядного числа.

  • Если все высокие 32 бита числа являются одним и если самый высокий бит из низких 32 битов также является одним (то есть, если число от 0xFFFFFFFF'8000000000 до 0xFFFFFFFF'FFFFFFFFFF), отладчик предполагает, что число является 32-разрядным числом со знаком и отображает его в виде 32-разрядного числа.

  • Если два предыдущих условия не применяются (т. е. число от 0x00000001'0000000000 до 0xFFFFFFFF'7FFFFFFF), отладчик отображает это число в виде 64-разрядного числа.

Из-за этих правил отображения, когда число отображается в виде 32-разрядного числа от 0x80000000 до 0xFFFFFFFF, вы не можете подтвердить, являются ли высокие 32 биты единицами или нулями. Чтобы различать эти два случая, необходимо выполнить дополнительные вычисления числа (например, маскировать один или несколько высоких битов и отобразить результат).

См. также раздел

Числа и операторы MASM

Числа и операторы C++

Выражения MASM и C++

Примеры смешанных выражений

Расширение sign