доступ к коду условия сборки
-
16-09-2019 - |
Вопрос
См .: Нести Флаг
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 ?