setbe
устанавливает результат в 1, если (ZF=1) or (CF=1)
. Если в документации, которую вы читаете, написано, что она установлена на (ZF=0) and (CF=1)
, это неправильно. См. Справочное руководство программиста 80386 . Ниже приведен подробный анализ:
setbe
устанавливает результат в 1, если результат предыдущего сравнения был b elow-or- e qual, при сравнении как целые числа без знака (эквивалент для целых чисел со знаком будет setle
, для l ess-or- e qual).
Когда выполняется инструкция cmp
, операнд-адресат вычитается из операнда-источника, а результат отбрасывается. Единственным выходом является установка флагов условий. Помните, что когда мы вычитаем два числа A-B
, мы действительно добавляем A+(~B)+1
в дополнение к двум, где ~B
- это дополнение к одному из B
(т.е. все биты переворачиваются).
Давайте рассмотрим 6 случаев:
Case 0: Compare 1 to 0
0 - 1
= 0 + ~1 + 1
= 0x00000000 + 0xfffffffe + 1
= 0xffffffff ≠ 0, no carry
==> ZF = 0, CF = 0
Case 1: Compare 0 to 0
0 - 0
= 0 + ~0 + 1
= 0x00000000 + 0xffffffff + 1
= 0x00000000 = 0, with carry
==> ZF = 1, CF = 0
Case 2: Compare 0 to 1
1 - 0
= 1 + ~0 + 1
= 0x00000001 + 0xffffffff + 1
= 0x00000001 ≠ 0, with carry
==> ZF = 0, CF = 1
Case 3: Compare UINT_MAX to 0
0 - 4294967295
= 0 + ~4294967295 + 1
= 0x00000000 + 0x00000000 + 1
= 0x00000001 ≠ 0, no carry
==> ZF = 0, CF = 0
Case 4: Compare 0 to UINT_MAX
4294967295 - 0
= 4294967295 + ~0 + 1
= 0xffffffff + 0xffffffff + 1
= 0xffffffff ≠ 0, with carry
==> ZF = 0, CF = 1
Case 5: Compare UINT_MAX to UINT_MAX
4294967295 - 4294967295
= 4294967295 + ~4294967295 + 1
= 0xffffffff + 0x00000000 + 1
= 0x00000000 = 0, with carry
==> ZF = 1, CF = 1
Случаи, в которых первый аргумент ниже или равен второму, являются случаями 1, 2, 4 и 5. Все они удовлетворяют (ZF=1) or (CF=1)
, а остальные случаи, в которых сравнение является ложным, удовлетворяют противоположное условие, (ZF=0) and (CF=0)
. Обратите внимание, что мы также перечислили все возможные комбинации CF и ZF. Следовательно, мы приходим к выводу, что правильное поведение для setbe
должно быть установлено на (ZF=1) or (CF=1)
.