Сборка - использование флагов переноса и переполнения в реальном программировании сборки - PullRequest
0 голосов
/ 23 октября 2018

После некоторого прочтения на http://teaching.idallen.com/dat2343/10f/notes/040_overflow.txt, я понимаю, что флаг переноса используется для указания некоторой «потери данных» / «за пределами», а флаг переполнения используется для указания «старший значащий бит включен / выключен, тогда как онибыли выключены / включены ранее ".Я также видел другой ответ, который дает подсказку при проверке флагов для чисел со знаком / без знака:

«проверять наличие отрицательных и переполненных флагов при работе со знаковыми числами и переносить флаги с беззнаковыми». (извиняюсь, что не могу найти этот ответ снова для справки)

Я понимаю ассоциации флагов, но, насколько я читал, примеры проверки флагов указывают толькокогда установлены флаги, и Я действительно не понимаю использования флага переноса и флага переполнения за пределами проверки ошибок.

Например, флаги для ja и jg, Iпрочитайте ответ, который гласил:

ja прыгает, если CF = 0 и ZF = 0 jg прыгает, если ZF = 0 и SF = OF

( Разница междуJA и JG в сборке )

Я понимаю, для чего используется флаг нуля (чтобы проверить, что они не равны), но не так много для CF и SF / OF.

Ниже приведен мой удар по интерпретации, игнорирующий ZF как предварительное условие

ja (unsigned): если CF = 0, «заимствовать» нетиз первого операнда для вычитания.Следовательно, если ZF = 0, сравнение верно.

jg (signed): если SF (мы называем это отрицательным флагом, я считаю) и OF (мы называем это флагом oVerflow) оба равны 0, это означает, что оба операндаположительны и результат также положительный, что указывает на lhs> = rhs; не могу обернуться вокруг случаев, когда они оба равны 1 или SF! = OF, так как я не вижу, как это указывает lhs> = rhs и lhs

Редактировать: я продолжал тестировать случаи, когда SF = 1 и OF = 1, но я встречал только случаи, когда они оба равны 0. Поэтому я не понимаю, почему SF = OF работает как сравнение.Например, 1000–1000, 1000–0100. или Я неправильно понимаю намерение этого сравнения, что оно никогда не достигнет SF = 1 и OF = 1, только если они не равны друг другу,результат будет ложным?

Спасибо, что нашли время, чтобы прочитать это и любые указатели относительно того, как флаги используются в этом примере, как флаги используются в общем коде сборки, будет принята с благодарностью.Дайте мне знать, если мне не хватает необходимой информации.

1 Ответ

0 голосов
/ 23 октября 2018

Мнемоника «условия» (например, «A» для «Выше») работает, если для флагов установлено значение cmp eax, edx.

, например, после cmp edx,eax, условие «Выше» истинно, если edx > eax (сравнение без знака),
и условие Greater истинно, если edx > eax (сравнение со знаком).

Посмотрите определения каждого условия в http://felixcloutier.com/x86/Jcc.html или http://felixcloutier.com/x86/SETcc.html и проработайте его самостоятельноесли вам интересно.

Проверка на «потерю данных» или переполнение - это один из вариантов использования флагов (и откуда их имена), но проверка их после сравнения встречается гораздо чаще.

...