Деление вычитанием на At89c51 в среде keil uvision

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
yeti2332
Родился
Сообщения: 5
Зарегистрирован: Сб апр 26, 2014 18:10:34

Деление вычитанием на At89c51 в среде keil uvision

Сообщение yeti2332 »

Люди добрые, может ли кто то помочь с данной проблемой:
Нужно разделить 32бит(регистры R4R3R2R1-слева старший) на 16 бит(R6R5-слева старший)
препод сказал делать деление вычитанием(но если кто-то поможет сделать и не вычитанием, было бы замечательно, препод бы оценил)

вот, что получается у меня(так сказал препод):

Vichitanie:

mov R0,#4

metka5:
mov A,R1
subb A,R5
mov R1,A

mov A,R2
subb A,R6
mov R2,A

mov A,R3
subb A,#0
mov R3,A

mov A,R4
subb A,#0
mov R4,A

Jc konec

mov A,R7
Add A,#1
mov R7, A
mov A, R7
Addc a,#0
mov R7,A
djnz R0,metka5
konec:

ret
end

Исправьте, пожалуйста ошибку, подозреваю, что она где то после Jc konec, ибо в регистр R7 нужно было, как я понял записать результат вычитания, но как сделать, если он больше 8 бит.

Заранее премного благодарен.
Последний раз редактировалось yeti2332 Сб апр 26, 2014 19:16:59, всего редактировалось 1 раз.
Реклама
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Деление вычитанием на At89c51 в среде keil uvision

Сообщение pyzhman »

Код: Выделить всё

mov A,R1
subb A,R5
Это как это вы из разряда тысяч (образно) вычитаете разряд десятков (образно)? :shock:
Docendo discimus
Реклама
yeti2332
Родился
Сообщения: 5
Зарегистрирован: Сб апр 26, 2014 18:10:34

Re: Деление вычитанием на At89c51 в среде keil uvision

Сообщение yeti2332 »

Прошу прощения, опечатался, R1R2R3R4-справа старший, ну или R4R3R2R1, аналогично и с R5R6
Последний раз редактировалось yeti2332 Сб апр 26, 2014 19:22:26, всего редактировалось 1 раз.
yeti2332
Родился
Сообщения: 5
Зарегистрирован: Сб апр 26, 2014 18:10:34

Re: Деление вычитанием на At89c51 в среде keil uvision

Сообщение yeti2332 »

поправил условие
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Ser60
Друг Кота
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Re: Деление вычитанием на At89c51 в среде keil uvision

Сообщение Ser60 »

1. Сразу после метки 5 добавьте команду "clr C"
2. Результат деления 32-битного числа на 16-битное в общем случае также 32-битный. Поэтому для его хранения нужно 4 регистра (или 4 байта в памяти). Если хотите использовать регистры, переключитесь перед добавлением 1 к результату деления в другой банк регистров манипуляцией битами в PSW. В конце этого процесса не забудьте переключится назад в прежний банк.
Реклама
pcb
Опытный кот
Сообщения: 833
Зарегистрирован: Пт авг 12, 2011 09:14:27
Откуда: Млечный путь/Земля/РФ/Екатеринбург

Re: Деление вычитанием на At89c51 в среде keil uvision

Сообщение pcb »

Фрунзе А. Трехтомник. деление умножение сложение вычитание. Всё есть :tea:
Разработал:
-BLDC
-ФУОЗ/МПСЗ
-SMART BMS
-ECU/EDC на STM32F4(43%)+CPLD(57%)
-Моноинжектор на ATSAMD20G16
-контроллер эффектов для RGB LED ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ
Реклама
yeti2332
Родился
Сообщения: 5
Зарегистрирован: Сб апр 26, 2014 18:10:34

Re: Деление вычитанием на At89c51 в среде keil uvision

Сообщение yeti2332 »

Программа не работает, поэтому и прошу помощи, кто-то может конкретно написать, что не правильно в программе(поставил clr с в начале)? И что должно быть в регистре R7 результат какой? младший, старший, средний?
Аватара пользователя
ua1arn
Встал на лапы
Сообщения: 81
Зарегистрирован: Вт май 08, 2012 23:15:45
Откуда: Санкт - Петербург

Re: Деление вычитанием на At89c51 в среде keil uvision

Сообщение ua1arn »

Попробуйте перевести в нужные Вам мнемоники эту функцию деления - в 80-х годах подсмотрено в журнале Электроникс - для процессора 8080, с тех пор перенесено под все нужные мне процссоры:

Код: Выделить всё

;
;	de = hlde / bc
;	hl = hlde % bc
DIV:    ld      a,l
        sub     c
        ld      a,h
        sbc     a,b
        ret     nc      ; overflow
        xor     a
DIV0:   add     hl,hl   ; shift << (31..16)
        push    af      ; save count and cy
        ex      de,hl
        add     hl,hl   ; shift << (15..0)
        ex      de,hl
        jp      nc,DIV1
        inc     hl
DIV1	EQU	$
;
        ld      a,l     ; hl = hl - bc;
        sub     c
        ld      l,a
        ld      a,h
        sbc     a,b
        ld      h,a
        jp      c,DIV3  ; delitelx > delimoe
        pop     af      ; restore count and cy
DIV2:   inc     de      ; one bit to result.
        jp      DIV4
;
DIV3:   pop     af
        jp      c,DIV2  ; set one bit to result.
        add     hl,bc   ; restore - hl = hl + bc
DIV4:   add     a,10H
        jp      nc,DIV0 ; repeat 16
	RET
yeti2332
Родился
Сообщения: 5
Зарегистрирован: Сб апр 26, 2014 18:10:34

Re: Деление вычитанием на At89c51 в среде keil uvision

Сообщение yeti2332 »

ребят, кто-то шарит этом или нет? говорю изучаю ассемблер 2 дня, мне предлагают перевести незнакомый код, еще из 80-х.(я благодарен за помощь, но мне нужно подразжевать)
Аватара пользователя
Ser60
Друг Кота
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Re: Деление вычитанием на At89c51 в среде keil uvision

Сообщение Ser60 »

clr в начале цикла нужно для обнуления заема при вычитании младших байтов чисел.
yeti2332 писал(а):И что должно быть в регистре R7...?
В данной программе белиберда. Но если манипуляции с R7 в программе свести к

Код: Выделить всё

mov A,R7
Add A,#1
mov R7, A
то в R7 будет младший байт реяультата. Вы почему-то проигнорировали мой второй совет из поста выше. Там и описано решение. Одного 8-битного регистра R7 не хватит для представления 32-битного результата - нужно 4 регистра. Но т.к. в программе уже заняты 6 регистров из 8-ми в данном банке, следует либо переключиться на другой банк регистров, либо использовать память. Если не поминаете о чем я здесь пишу, прочитайте в любой книге по архитектуре М51 что такое банки регистров и как их переключать.
Аватара пользователя
ua1arn
Встал на лапы
Сообщения: 81
Зарегистрирован: Вт май 08, 2012 23:15:45
Откуда: Санкт - Петербург

Re: Деление вычитанием на At89c51 в среде keil uvision

Сообщение ua1arn »

разделить 32бит(регистры R4R3R2R1-слева старший) на 16 бит(R6R5-слева старший)
При "делении с восстановлением остатка" результат образуется в тех же регистрах, где было делимое.
Дополнительно нужен только один регистр - для счетчика на 16 и рабочий регистр А для выполнения многобайтной арифметики.
Яндекс в помощь с гуглём, хотя работающего исходника на незнакомом процессоре вполне хватит для разбирательств с алгоритмом.
Аватара пользователя
Ser60
Друг Кота
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Re: Деление вычитанием на At89c51 в среде keil uvision

Сообщение Ser60 »

Вообще-то, при классической реализации деления чисел путем вычитания делителя из делимого и последующего сдвига, как с восстановлением остатка так и без него, в регистрах делимого остается не частное а остаток от деления. Частное при этом накапливается на стороне в дополнительных регистрах, см. например
http://www.gaskley.narod.ru/Discr/Discr_Math_22.html
Конечно, можно попробовать сохранять биты частного на месте использованных на предыдущих итерациях битов делимого. При такой реализации потребуется еще где-то помнить в какой бит и в какой байт делимого поместить бит частного после каждой итерации. Но если Вам, ua1arn, изветна более простая реализация 32:16-бит деления с получением частного в битах делимого и использованием только одного дополнительного регистра для счетчика (и еще А), как Вы указали, просьба сообщить.
Аватара пользователя
ua1arn
Встал на лапы
Сообщения: 81
Зарегистрирован: Вт май 08, 2012 23:15:45
Откуда: Санкт - Петербург

Re: Деление вычитанием на At89c51 в среде keil uvision

Сообщение ua1arn »

При такой реализации потребуется еще где-то помнить в какой бит и в какой байт делимого поместить бит частного после каждой итерации. Но если Вам, ua1arn, изветна более простая реализация 32:16-бит деления с получением частного в битах делимого и использованием только одного дополнительного регистра для счетчика (и еще А), как Вы указали, просьба сообщить.
Так этот алгоритм в ассемблере z80 и приведён выше.
Алгоритм, переделанный для чисел любой длины на массивах - в аттачменте.
Вложения
PHASE.H
(2.8 КБ) 235 скачиваний
PHASE.CPP
(7.64 КБ) 260 скачиваний
Аватара пользователя
Ser60
Друг Кота
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Re: Деление вычитанием на At89c51 в среде keil uvision

Сообщение Ser60 »

Вышеприведенный алгоритм на ассемблере работает корректно только если частное не превосходит 16 бит. В противном случае оно просто не поместится в регистровую пару de и в ней будут только младшие 2 байта результата (с остатком в hl все нормально). К тому-же помимо регистров алгоритм на каждой итерации использует память (стек).

А код из аттачмента на C/C++ и не ясно использует-ли он после компиляции какие-либо дополнительные ресурсы на уровне команд процессора (например, память и сколькоее) а не только регистры для организации деления.
Ответить

Вернуться в «Разные вопросы по МК»