доступ к коду состояния сборки - PullRequest
0 голосов
/ 27 апреля 2009

CF: Флаг переноса

ZF: Нулевой флаг

Сейчас я читаю книгу по сборке Intel x86 на платформе Linux с использованием синтаксиса AT & T, и в книге сказано, что эффект setbe D эквивалентен:

D & larr; CF & ~ ZF

Я понял это, но мог ли он просто написать:

D & larr; CF | ZF

это отличается от ~ ZF & CF только тогда, когда CF / ZF равен 1/1 или 1 / 0., что является более точным?

Ответы [ 3 ]

3 голосов
/ 27 апреля 2009

Подумайте о таблицах истинности.

| CF | ZF | CF &~ZF | CF|ZF |
+---------------------------+
   0    0      0        0
   0    1      0        1
   1    0      1        1
   1    1      0        1

Таблицы истинности разные, поэтому нет, они не одинаковы.

2 голосов
/ 27 апреля 2009

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).

0 голосов
/ 27 апреля 2009

SETBE ниже или равно (CF = 1 или ZF = 1) Вы уверены, что CF & ~ ZF верны? Может ли инструкция быть SETB или SETL?

...