Поклонники продукции Microchip Technology Inc тусуются тут.
Ср ноя 04, 2020 16:03:51
Добрый день, радиолюбители.
Есть маленькая проблемка. Код программы деления:
;=====деление======================
;==============
; ПОДПРОГРАММА ДЕЛЕНИЯ 5-РАЗРЯДНОГО СЛОВА (TEMP_1L1) НА 4-Х РАЗРЯДНОЕ (TEMP_1L)
; Результат - TEMP_1L1, остаток - TEMP_1L2
;=================
DIV_5_4 ;TEMP_1L1 / TEMP_1L = TEMP_1L1; TEMP_1L2 - остаток
;проверка делителя на 0
movf TEMP_2H,F,1 ;
btfss STATUS,Z,0 ;
movf TEMP_1H,F,1 ;
btfss STATUS,Z,0 ;
goto Div_5_4 ;
movf TEMP_1M,F,1 ;
btfss STATUS,Z,0 ;
goto Div_5_4 ;
movf TEMP_1L,F,1 ;
btfsc STATUS,Z,0 ;
retlw 0 ;
Div_5_4
call Setup40 ;перенос делимого во временный регистр
clrf TEMP_2H2 ;сброс остатка
clrf TEMP_1H2 ;сброс остатка
clrf TEMP_1M2 ;
clrf TEMP_1L2
Dloop40
bcf STATUS,C,0
rlcf TEMP_1L3,F,1 ;сдвиг влево младшего делимого
rlcf TEMP_1M3,F,1
rlcf TEMP_1H3,F,1 ;
rlcf TEMP_2H3,F,1 ;
rlcf TEMP_3H3,F,1 ;
rlcf TEMP_1L2,F,1 ;сдвиг влево младшего остатка
rlcf TEMP_1M2,F,1
rlcf TEMP_1H2,F,1
rlcf TEMP_2H2,F,1
movf TEMP_2H,W,1 ;проверяем, превышает старший остаток делитель
subwf TEMP_2H2,W,1 ; проверка
btfss STATUS,Z,0
goto Nochk40
movf TEMP_1H,W,1 ;
subwf TEMP_1H2,W,1 ; проверка
btfss STATUS,Z,0
goto Nochk40
movf TEMP_1M,W,1
subwf TEMP_1M2,W,1 ; проверка
btfss STATUS,Z,0
goto Nochk40
movf TEMP_1L,W,1 ;если равен, проверяем младший
subwf TEMP_1L2,W
Nochk40
btfss STATUS,C,0 ; перенос если
goto Nogo40 ; если остаток больше делителя
movf TEMP_1L,W,1 ;
subwf TEMP_1L2,F,1 ;
btfss STATUS,C,0
decf TEMP_1M2,F,1
movf TEMP_1M,W,1
subwf TEMP_1M2,F,1
btfss STATUS,C,0
decf TEMP_1H2,F,1
movf TEMP_1H,W,1
subwf TEMP_1H2,F,1
btfss STATUS,C,0
decf TEMP_2H2,F,1
movf TEMP_2H,W,1
subwf TEMP_2H2,F,1
bsf STATUS,C,0 ; переместить
Nogo40
rlcf TEMP_1L1,F,1
rlcf TEMP_1M1,F,1
rlcf TEMP_1H1,F,1
rlcf TEMP_2H1,F,1
rlcf TEMP_3H1,F,1 ;!!!!!!!!!!!!!!!
decfsz Temp,F,0 ; цикл пока все биты не проверим
goto Dloop40
retlw 0
Setup40
movlw .40 ; установки для 40 циклов
movwf Temp,0
movff TEMP_3H1,TEMP_3H3 ;
movff TEMP_2H1,TEMP_2H3 ;
movff TEMP_1H1,TEMP_1H3 ;
movff TEMP_1M1,TEMP_1M3 ;
movff TEMP_1L1,TEMP_1L3 ;
clrf TEMP_3H1,1
clrf TEMP_2H1,1
clrf TEMP_1H1,1
clrf TEMP_1M1,1
clrf TEMP_1L1,1
retlw 0
;=====деление======================
Вроде бы делит нормально. Но !!!!!!!!!!
Два числа 43024784875 / 100 000 делит неправильно. Должно быть 430 247 а получается 430 331 ???
Помогите найти ошибку.
Сб ноя 07, 2020 06:09:18
Разрядность делимого и делителя по какому основанию считалась?
Во первых, код нужно оформлять в тегах кода. С положенным для кода форматированием.
Во вторых, у меня ощущение, что вы этот код не писали. Патамушта с именами регистров переменных какой то рандомный бред. Лично у меня разбираться в этой каше нет никакого желания.
Вт ноя 10, 2020 07:26:52
Чтобы разбираться в этой каше надо соображать..!!! Кто не соображает, не пишите.
Вт ноя 10, 2020 08:43:05
Вот и не пишет ни кто уже 6 дней.
Вт ноя 10, 2020 11:35:17
Чтобы разбираться в этой каше надо соображать..!!!
Смешно. Вы пришли с вопросом ровно потому, что не понимаете как работает этот код. Вывалили код, в котором имена регистров выбраны так, чтобы максимально усложнить разбор кода. Мало этого, вы говорите о 4 и 5 разрядах операндов и не в состоянии ответить на вопрос об основании счисления. Можно только догадываться, что речь идет о шестнадцатиричном основании, то есть 16 и 20 бинарных разрядах, но тогда операнды выходят за диапазон...
Ну и нахрена мне тратить время на всю эту галиматью студня-недоучки?
Вт ноя 10, 2020 14:46:07
Чтобы разбираться в этой каше надо соображать..!!!
Смешно. Вы пришли с вопросом ровно потому, что не понимаете как работает этот код. Вывалили код, в котором имена регистров выбраны так, чтобы максимально усложнить разбор кода. Мало этого, вы говорите о 4 и 5 разрядах операндов и не в состоянии ответить на вопрос об основании счисления. Можно только догадываться, что речь идет о шестнадцатиричном основании, то есть 16 и 20 бинарных разрядах, но тогда операнды выходят за диапазон...
Ну и нахрена мне тратить время на всю эту галиматью студня-недоучки?
Тему можно закрыть, надоело читать этот безграмотный бред с оскорблениями.
Вт ноя 10, 2020 14:54:38
Вообще-то для подобной тестировки есть СИМУЛЯТОР -делаем пошаговое выполнение и анализируем результат.
Вт ноя 10, 2020 20:41:28
Не судите строго...
Не всем же САМОСТОЯТЕЛЬНО пробиваться.
По своему опыту - иногда действительно на ошибочном решении можно зациклиться до "поцарапса" - тогда единственно разумное решение - начать всю прожку ЗАНОВО (через одну-две недельки).