Предположим AX =FFFE и BX=1234
теперь, если мы пишем cmp ax,bx
(основной обмен будет вычтен из топора, и approprite flages будет обновлен), теперь, двоичным представлением чисел в топоре и основном обмене дают
AX = 1111 1111 1111 1110
BX= 0001 0010 0011 0100
Поскольку основной обмен будет вычтен из топора, таким образом, мы должны будем инвертировать основной обмен (как Результат = топор + (-основной-обмен)), таким образом, отрицаемым основным обменом (2's дополнение основного обмена) дают.
BX= 1110 1101 1100 1100
Теперь мы добавляем и топор и основной обмен (поскольку вычитание реализовано дополнением в компьютере),
AX= 1111 1111 1111 1110
BX= 1110 1101 1100 1100
------------------------------------
1 1110 1101 1100 1010
Теперь, поскольку Вы видите, что результат имеет 17 битов теперь, 17-й бит должен войти, несут flage, но когда я проверил его, флаг переноса 0, который является CF=0 почему?
Нашел ссылку здесь: http://oopweb.com/Assembly/Documents/ArtOfAssembly/Volume/Chapter_6/CH06-2.html
Все, как я ожидал. Флаг переноса устанавливается, только если требовалось «заимствовать». При выполнении вычитания вы устанавливаете флаг переноса перед выполнением «вычитания», а новый флаг переноса сообщает, приходилось ли вам заимствовать. В вашем примере пропущено добавление 1 для предварительно установленного флага переноса в бите 17, что не приведет к отсутствию переноса в результате.
Считайте флаг переноса битом заимствования при выполнении вычитания. Он инициализируется значением 1, поэтому операция a − b − C
, то есть a + not (b) + C
вместо a + not (b) + 1
, как вы описали. Другими словами, перенос инвертируется для вычитания, поэтому его можно использовать для вычитания с множественной точностью.