[an error occurred while processing this directive]
В мыло лень. Я в тело брошу
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено -mse- 05 января 2006 г. 16:44
В ответ на: Ну почему, можно посмотреть. Пришлите мне свой вариант на мыло, а я Вам - свой. отправлено <font color=gray>GM</font> 05 января 2006 г. 16:33

Обычьный вариант от Атымеля, расширеный и углубленный: 32/16=32


.def drem16uL=r12 ;remainder
.def drem16uM=r13

.def dres16uL=r8 ;result
.def dres16uM=r9
.def dres16uH=r10
.def dres16HH=r11

.def dd16uL =r8 ;divident
.def dd16uM =r9
.def dd16uH =r10
.def dd16uHH =r11

.def dv16uL =r16 ;divisor
.def dv16uH =r17

.def dcnt16u =r20
.def zero_reg=r2

div16u: clr drem16uL ;clear remainder Low byte
sub drem16uM,drem16uM;clear remainder High byte and carry
ldi dcnt16u,32 ;init loop counter


rol dd16uL ;shift left dividend
rol dd16uM
rol dd16uH
rol dd16uHH

d16u_2: rol drem16uL ;shift dividend into remainder
rol drem16uM
brcs d16u_31

sub drem16uL,dv16uL ;remainder = remainder - divisor
sbc drem16uM,dv16uH ;

brcc d16u_3 ;if result negative
add drem16uL,dv16uL ; restore remainder
adc drem16uM,dv16uH

lsl dd16uL ;shift left dividend
rol dd16uM
rol dd16uH
rol dd16uHH

dec dcnt16u ;decrement counter
brne d16u_2 ;if done
ret

d16u_31:
sub drem16uL,dv16uL ;remainder = remainder - divisor
sbc drem16uM,dv16uH ;

d16u_3: sec ; set carry to be shifted into result
rol dd16uL ;shift left dividend
rol dd16uM
rol dd16uH
rol dd16uHH

dec dcnt16u ;decrement counter
brne d16u_2 ;if done
ret ; return


Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 
NoIX ключ Запомнить

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Rambler's Top100 Рейтинг@Mail.ru
Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание

E-mail: info@telesys.ru