Перейти на основе сравнения целых чисел, использующих флаг Zero, Sign и Overflow, чтобы определить взаимосвязь между операндами. После CMP
с двумя подписанными операндами, есть три возможных сценария-х:Как сравнить флаг Sign and Overflow Flag с отношениями операндов?
ZF = 1
- Destination = SourceSF = OF
- Destination> ИсточникSF != OF
- Destination < Источник
У меня проблемы с пониманием сценариев 2 и 3. Я работал с возможными комбинациями и вижу, что они работают, но я до сих пор не могу понять, почему они работают.
Может ли кто-нибудь объяснить, почему сравнение флагов Sign and Overflow отражает подписанные целочисленные отношения?
Edit:
Там, кажется, некоторое понимание относительно того, что я спрашиваю. В прыжках, основанных на подписанных сравнениях, используются флаг Zero, Sign и Carry - они включают JG
, JL
и так далее.
Например:
mov al, 1
cmp al, -1
jg isGreater
isGreater:
Скачок берется из-за переполнения флаг = флаг знака (оба равны 0), что указывает в терминах подписанного сравнения, операнд назначения больше источника.
Если флаг переполнения установлен в 1, а флаг знака установлен в 0, это означает, что назначение меньше.
Мои вопросы - я просто не могу обернуть голову, ПОЧЕМУ это действительно работает.
Подумайте о сравнении как вычитание, когда результат отбрасывается - флаги и их интерпретация имеют больше смысла в этом свете (по крайней мере для меня). –
Из тега [tag: x86] wiki: http://teaching.idallen.com/dat2343/10f/notes/040_overflow.txt –
Я понимаю CMP, Carry и Overflow. Я говорю, что не понимаю, как сочетание флага Sign and Overflow отражает взаимосвязь между двумя подписанными операндами, используемыми Jumps на основе подписанных сравнений. – cafekaze