АвторСообщение
постоянный участник




Пост N: 85
Зарегистрирован: 03.03.09
Откуда: Россия, г. Санкт-Петербург
Рейтинг: 0
ссылка на сообщение  Отправлено: 09.07.10 00:13. Заголовок: Работа с отрицательными числами


Сейчас занимаюсь написанием упрощенного алгоритма деления 2-х байтного на однобайтное для pic18.
Экономия машинных циклов в 3-4 раза.
Столкнулся с проблемой при отладке:
Если некий регистр Reg в результате операции subwf один раз стал отрицательным
То последующие sublw и movf с его участием приводят к взведению флага N регистра статус.
А мне как раз важно делать проверку на отрицательность результата, а пику не объяснишь что это младший байт двухбайтного числа.
Пример:

movlw .10 ;
movwf Reg ; status<N>=0
movlw .20 ;
subwf Reg,F ; Reg=.246 status<N>=1 10-20 = -10
movlw .5 ;
subwf Reg,F ; Reg=.241 status<N>=1 Хотя 246-5=241 рез-т положительный!


Как быть? Как сделать его положительным.

Пробовал функцию negf - не помогает
Даже 256 прибавлял. Результат - взвод флага OV (status).


Экономия времени окупает экономию средств. Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 4 [только новые]


постоянный участник


Пост N: 1305
Зарегистрирован: 26.12.06
Откуда: Россия, Архангельск
Рейтинг: 3
Фото:
ссылка на сообщение  Отправлено: 09.07.10 01:12. Заголовок: VLAD пишет: Как быт..


VLAD пишет:

 цитата:
Как быть? Как сделать его положительным.

А в чем проблема то??? Результат абсолютно верный -15... Что сделать положительным??? Отрицательное число? Тогда тегф, получится 15... если нужно получить 241 то так и получается, оно и так положительно, и даже все арифметические действия с ним верны... Если прибавить 256 то флаг и должен подняться...
Если же надо учесть заем или перенос то используется флаг С, а также спец. команды сложения и вычитания с переносом и заемом...

Еще неизвестно, что хуже: постоянный бардак или непостоянный порядок? Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 86
Зарегистрирован: 03.03.09
Откуда: Россия, г. Санкт-Петербург
Рейтинг: 0
ссылка на сообщение  Отправлено: 09.07.10 17:11. Заголовок: Алексей пишет: А в ..


Алексей пишет:

 цитата:
А в чем проблема то???



приведу более понятный пример:

цикл: последовательное вычитание из регистра 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" перед вычитанием.
Тоже вариант безущербный.

Экономия времени окупает экономию средств. Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 87
Зарегистрирован: 03.03.09
Откуда: Россия, г. Санкт-Петербург
Рейтинг: 0
ссылка на сообщение  Отправлено: 11.07.10 13:10. Заголовок: Использовал функции ..


Использовал функции сравнения "cpfsgt" и "cpsflt".
Программа работает как часы, время выполнения в 1,5-2,5 раза меньше чем у "оптимизированного" аналога в самоучителе.
Подготовлю описание и поделюсь с КЕА.

Вот результаты по времени выполнения:

Деление чисел: FFFF:1 / 16:16 / ABBA:AA

программа из практикума: 1100 / 333 / 366 машинных циклов
новая прога: 660 / 149 / 261 машинных циклов

Прям сам радуюсь

Экономия времени окупает экономию средств. Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 2016
Зарегистрирован: 06.05.07
Откуда: Россия, Липецк
Рейтинг: 5
ссылка на сообщение  Отправлено: 11.07.10 17:11. Заголовок: Владислав, смотрите..


Владислав, смотрите ЛС.

Безумству храбрых поем мы песню (А.М.Горький) Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 8
Права: смайлы да, картинки да, шрифты нет, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет



Создай свой форум на сервисе Borda.ru
Текстовая версия