Предположим AX=8FFE и BX = 0FFF
Теперь, если мы пишем
Cmp ax,bx
Теперь в этой точке, что произойдет, источник (основной обмен) будет вычтен от места назначения (топор), и соответствующие флаги будут обновлены. Как компьютер представляют каждое число в 2’s, дополнительная форма так 8FFE 2’s, дополнение некоторого числа так же 0FFF 2’s дополнение некоторого числа.
Как в 2’s дополняют вычитание, реализован дополнением, таким образом, мы добавляем эти два числа путем преобразования их в двоичный файл.
8FFE----------> 1000 1111 1111 1110
0FFF----------> 0000 1111 1111 1111
--------------------------------
1001 1111 1111 1101
Теперь это - результат, который является 9FFD в шестнадцатеричном числе.
Поскольку Вы видите, что никакое переполнение не произошло, и знаковый бит является 1 из результата.
Вопрос: С этим воображением, что флаг знака должен быть установлен и водосливный флаг
Должен остаться 0, я проверил это в отладчике, но я нашел Противоположность его
то есть, флаг знака остается 0, и водосливный флаг равняется 1. Теперь скажите мне почему
это происходит?
Думаю, вы вычитали неправильно. Мой результат:
8FFE----------> 1000 1111 1111 1110
0FFF----------> 0000 1111 1111 1111
----------------------------------
7FFF----------> 0111 1111 1111 1111
произошло то, что операция заимствована только из знакового бита. Это означает, что должен быть установлен флаг OF. Прочтите здесь о сборке CF (Carry) и OF (Overflow) flag , http://en.wikipedia.org/wiki/Carry_flag , http: // en. wikipedia.org/wiki/Overflow_flag. Это означает, что это была подписанная операция, это неверно. если он был без подписи, то нормально.