Флаг знака и флаг переполнения не работают в соответствии с ожиданиями - PullRequest
1 голос
/ 24 мая 2010

Предположим, что AX = 8FFE и BX = 0FFF
Теперь, если мы напишем

Cmp ax,bx 

Теперь в этой точке произойдет то, что источник (bx) будет вычтен из пункта назначения (топор) исоответствующие флаги будут обновлены.Поскольку компьютер представляет каждое число в форме дополнения 2, то 8FFE является дополнением 2 некоторого числа аналогично 0FFF является дополнением некоторого числа 2.

Как и в дополнении 2, вычитание осуществляется путем сложения, поэтому мы добавляем эти два числа какпреобразование их в двоичный файл.

 8FFE---------->    1000    1111    1111    1110
0FFF---------->    0000    1111    1111    1111
                   --------------------------------
                   1001    1111    1111    1101 

Теперь это результат, который равен 9FFD в шестнадцатеричном формате.

Как вы можете видеть, переполнение не произошло, а знаковый бит равен 1 результата.

Вопрос: С этим воображением, что флаг знака должен быть установлен, а флаг переполнения
Должен остаться равным 0, я проверил это в отладчике, но нашел Противоположное ему
, то естьфлаг знака остается 0, а флаг переполнения равен 1. Теперь, пожалуйста, скажите мне, почему
это происходит?

1 Ответ

2 голосов
/ 24 мая 2010

я думаю, что вы сделали вычитание неправильно. Мой результат:

8FFE---------->    1000    1111    1111    1110
0FFF---------->    0000    1111    1111    1111
                   ----------------------------------
7FFF---------->    0111    1111    1111    1111     

произошло то, что операция заимствована только из знакового бита. Это означает, что флаг OF должен быть установлен. Прочитайте здесь о флагах CF (Carry) и OF (Overflow) сборки , http://en.wikipedia.org/wiki/Carry_flag, http://en.wikipedia.org/wiki/Overflow_flag. Это означает, что это была подписанная операция, это неверно. если оно не было подписано, тогда хорошо.

...