Почему cmp 0x84,0x30 вызывает флаг переполнения? - PullRequest
11 голосов
/ 31 августа 2011

Я играл с ассемблером некоторое время и смотрю какой-то код.в котором AL сначала устанавливается в 0x84, а затем в cmp AL, используется 0x30.Затем эта инструкция вызывает флаг переполнения.

Из того, что я прочитал, CMP должен вычесть второе число из первого, а затем установить флаги, в этом случае это должно быть 0x84-0x30, результат равен 0x54, и естьбез переполнения.

1 Ответ

18 голосов
/ 31 августа 2011

Нет переполнения, только если вы интерпретируете эти значения как числа без знака - если вы интерпретируете свои 0x84 как подписанные, это определенно переполнение:

  1. 0x84 интерпретируется как 8-битное значение со знаком-124
  2. 0x30 интерпретируется как 8-разрядное значение со знаком: 48
  3. -124 - 48 = -172

-172 находится вне диапазона8-битное значение со знаком (от -128 до +127), и поэтому устанавливается флаг OF.Вы должны проверить CF, который указывает на переполнение без знака.

Из Руководства разработчика программного обеспечения для архитектуры Intel 64 и IA-32 , том 2 для CMP:

Сравнение выполняется путем вычитания второго операнда изсначала операнд, а затем установка флагов состояния таким же образом, как инструкция SUB.

и для SUB:

Команда SUB выполняет целочисленное вычитание.Он оценивает результат для целочисленных операндов со знаком и без знака и устанавливает флаги OF и CF, чтобы указать переполнение в результате со знаком или без знака, соответственно.Флаг SF указывает знак подписанного результата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...