Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Деление 24-битного на 3-битное?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
alux
Как поделить 24-битное число на трехбитное без остатка? Поделитесь примерами. Есть пример 16/16. Как его использовать для моего случая?
yung
Если больше ничего в голову не приходит, то предложу решение в лоб. Требуется процедура умножения 16х16 (результат нужен 32-разрядный, такую процедуру атмеловцы в примерах дают). Берется тестовое число 0х800000.
Умножается на делитель (3- разрядный). Сравнивается с 24-разрядным делимым. А далее по теории методом половинного деления. Долго, но работает. В принципе для ускорения можно свою процедуру умножения 24*3 сделать, пусть даже методом сложения. Я когда-то так на ассемблере с 16-битными данными работал.
indela
здесь общий смысл деления можно понять и адаптировать для нужной разрядности делителя


;***************************************************************************
;*
;* "div16u" - 16/16 Bit Unsigned Division
;*
;* This subroutine divides the two 16-bit numbers
;* "dd8uH:dd8uL" (dividend) and "dv16uH:dv16uL" (divisor).
;* The result is placed in "dres16uH:dres16uL" and the remainder in
;* "drem16uH:drem16uL".
;*
;* Number of words :19
;* Number of cycles :235/251 (Min/Max)
;* Low registers used :2 (drem16uL,drem16uH)
;* High registers used :5 (dres16uL/byte,dres16uH/byteH,dv16uL,dv16uH,
;* dcnt16u)
;*
;***************************************************************************

;***** Subroutine Register Variables


;***** Code

div16u: clr drem16uL ;clear remainder Low byte
sub drem16uH,drem16uH;clear remainder High byte and carry
ldi cnt,17 ;init loop counter
d16u_1: rol byte ;shift left dividend
rol byteH
dec cnt ;decrement counter
brne d16u_2 ;if done
ret ; return
d16u_2: rol drem16uL ;shift dividend into remainder
rol drem16uH
sub drem16uL,dv16uL ;remainder = remainder - divisor
sbc drem16uH,dv16uH ;
brcc d16u_3 ;if result negative
add drem16uL,dv16uL ; restore remainder
adc drem16uH,dv16uH
clc ; clear carry to be shifted into result
rjmp d16u_1 ;else
d16u_3: sec ; set carry to be shifted into result
rjmp d16u_1
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.