[an error occurred while processing this directive]
|
Чтобы уж окончательно прояснить.
Делимое: unsigned long dividend=dendh*65536+dendl.
dendh - старшие 16 разрядов делимого, dendl- соответственно младшие.
Делитель: unsigned short divisor.
Результат: unsigned long result=[dividend/divisor]=
[(dendh*65536+dendl)/divisor]=[dendh/divisor]*65536+[((dendh%divisor)*65536+dendl)/65536]. [] -целая часть, %-остаток.
Таким образом старшие 16 разрядов результата (частного)=[dendh/divisor].
Для вычисления [dendh/divisor], dendh%divisor образуется long, младшие 16 которого=dendh, старшие =0. И этот long делится. Это по сути деление 16 на 16.
Младшие 16 частного =[((dendh%divisor)*65536+dendl)/65536].
Что на словах выглядит так: младшие 16 разрядов частного получаются делением еще одного long'a на исходный делитель. Младшие 16 разрядов этого long'a равны младшим 16 исходного делимого, а старшие 16 разрядов - остаток от деления старших 16 разрядов исходного делимого. Это второе деление - уже 32 на 16.
Дело в том, что парочка:
rpt #15
subc smem,A(B)
(или 16 штук subc) уже выполняет деление 32 на 16, но с 16 разрядным результатом, т.е. ограничение - старшие 16 разрядов делимого должны быть меньше делителя. Иначе частное не влезет в 16 разрядов. Частное, кстати, в младших 16 A, остаток в старших.
Собственно деление 16 на 16 с помощью этой парочки - делимое должно быть в младших 16 разрядах.
Вот и все.
E-mail: info@telesys.ru