Вопрос

См .: Нести Флаг

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

в настоящее время я читаю книгу о сборке intel x86 на платформе Linux с использованием синтаксиса AT & T, и в книге говорится, что эффект установить , что D является вторичным по отношению к:

DСм . & ~ ZF

я понял это, но не мог бы он просто написать как:

Д ← См .|ZF

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

Это было полезно?

Решение

setbe устанавливает результат на 1, если (ZF=1) or (CF=1). Анкет Если документация, которую вы читаете, говорит, что она устанавливает его на (ZF=0) and (CF=1), это не правильно. Увидеть Справочное руководство по программисту 80386. Анкет Ниже приведен подробный анализ:

setbe устанавливает результат на 1, если результат предыдущего сравнения был беременныйelow-or-е -квалификация, по сравнению с непосгинным целым (эквивалент для подписанных целых чисел будет setle, за лэссе или-е -квалификация).

Когда 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).

Другие советы

Подумайте о таблицах правды.

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

Таблицы истины разные, так что нет, они не одинаковы.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top