Алексей пишет:
приведу более понятный пример:
цикл: последовательное вычитание из регистра Temp2H:Temp2L регистра Temp0H:Temp0L
после вычитания логика программы должна витвиться в зависимости от того "+" или "-" результат
цепочка такая:
Next ...................
...................
movf Temp0H,W ; вычитание старших с проверкой что больше
subwf Temp2H,W ; 2H-0H
btfsc STATUS,N ; Если 2H меньше
goto DivNext ; переходим на меньший множитель
movwf Temp0H ; Если больше - сохраняем результат
bcf Flags,DivS ;
tstfsz Temp0H ;
bsf Flags,DivS ; если результат не ноль - взводим флаг
movf Temp0L,W ; вычитание младших с проверкой что больше
!!! subwf Temp2L,W ; 2L-0L
btfss STATUS,N ; Если 2L больше
goto DivSave ; сохраняем
btfss Flags,DivS ; Если 2L меньше, а H=0
goto DivNext ; переходим на меньший множитель
decf Temp0H,F ; иначе декремент старшего
DivSave movwf Temp2L ;
movff Temp0H,Temp2H;
....
....
goto Next ; следующий цикл
В строке, обозначенной (!!!) результат Temp2L может быть отрицательным несколько раз.
Как только появляется отрицательный результат вычитания, любое последующее обращение к Temp2L дает поднятие флага N.
В том числе и в той же самой строке (!!!), если на следующем цикле результат вычитания положительный, все равно STATUS_N = 1
Вот что я имел ввиду.
На крайняк придется использовать "cpfsgt" и "cpsflt" перед вычитанием.
Тоже вариант безущербный.