Почему cmp 0x84,0x30 запускает флаг переполнения?

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

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

Ответ 1

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

  • 0x84 интерпретируется как подписанное 8-битное значение -124
  • 0x30 интерпретируется как подписанное 8-битное значение 48
  • -124 - 48 = -172

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

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

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

и для SUB:

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