Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Если 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 являются расширенными, но 00000000`EEAA1122 и 0`EEAA1122 не являются.
32-разрядный регистр поддерживается в обоих режимах.
Псевдорегистры всегда хранятся в виде 64-разрядных значений. Они не подписываются при оценке. При присвоении значения псевдорегистру выражение оценивается согласно стандартным критериям C++.
Отдельные числа и регистры в выражении могут быть расширены со знаком, но никакие другие вычисления во время оценки выражений не расширяются со знаком. В результате можно маскировать большие биты числа или регистрировать с помощью следующего синтаксиса.
( 0x0`FFFFFFFF & expression )
Расширение знака в выражениях C++
При оценке выражения C++ отладчик применяет следующие правила:
Регистры и псевдорегистры никогда не являются расширенными.
Все остальные значения обрабатываются точно так же, как C++ будет обрабатывать значения их типа.
Отображение Sign-Extended и 64-разрядных чисел
Кроме 32-разрядных и 16-разрядных регистров, все числа хранятся внутри отладчика как 64-разрядные значения. Однако если число удовлетворяет определенным критериям, отладчик отображает его как 32-разрядное число в выходных данных команды.
Отладчик использует следующие критерии для определения способа отображения чисел:
Если высокие 32 бита числа равны нулю (то есть, если число от 0x00000000'00000000 до 0x00000000'FFFFFFFFFF), отладчик отображает число как 32-разрядное число.
Если старшие 32 бита числа равны единицам и если старший бит младших 32 бит также равен единице (то есть, если число находится в диапазоне от 0xFFFFFFFF`80000000 до 0xFFFFFFFF`FFFFFFFF), отладчик предполагает, что это число является расширенным со знаком 32-разрядным числом и отображает его как 32-разрядное число.
Если предыдущее два условия не применяются (то есть если число от 0x00000001'00000000 до 0xFFFFFFFF'7FFFFFFFFFFF) отладчик отображает число как 64-разрядное число.
Из-за этих правил отображения, если число отображается как 32-разрядное число от 0x80000000 до 0xFFFFFFFF, вы не можете подтвердить, являются ли высокие 32 биты всеми или всеми нулями. Чтобы различать эти два случая, необходимо выполнить дополнительные вычисления по числу (например, маскирование одного или нескольких больших битов и отображение результата).