Ребята, если не сложно помогите мне, пожалуйста,реализовать деление 16 битных целых безнаковых чисел до сотой доли (только на ASM для AVR Studio). Весьма срочно, горит проект.
Скомпилировал пример (деление 8 битных безнаковых целых чисел) имеющий в на CD и пришел к выводу, что его использовать и брать за основу нельзя.
Почему ???
Начнем с простого:
A = 56 (десят.)
B = 42 (десят.)
A/B =1.33 (десят.)
------------------------------
Моя реализованная программа:
(Код деления беззнаковых целых чисел взят из другого источника)
.NOLIST
.INCLUDE "m8def.inc"
.DEVICE ATmega8
.LIST
.def drem8u=r15 ;остаток
.def dres8u =r16 ;результат
.def dd8u =r16 ;делимое
.def dv8u =r17 ;делитель
.def dcnt8u =r18 ;счетчик цикла
//----------------------------------------------------
.DSEG
.ORG 0x60
//----------------------------------------------------
.ESEG
.ORG 0x00
//----------------------------------------------------
.CSEG
.ORG 0x00
//----------------------------------------------------
rjmp RESET ;0
rjmp 0 ;1
rjmp 0 ;2
rjmp 0 ;3
rjmp 0 ;4
rjmp 0 ;5
rjmp 0 ;6
rjmp 0 ;7
rjmp 0 ;8
rjmp 0 ;9
rjmp 0 ;10
rjmp 0 ;11
rjmp 0 ;12
rjmp 0 ;13
rjmp 0 ;14
rjmp 0 ;15
rjmp 0 ;16
rjmp 0 ;17
rjmp 0 ;18
//----------------------------------------------------
RESET: //--------------------------
// Setup STACK
ldi R16,high(RAMEND)
out SPH,R16
ldi R16,low(RAMEND)
out SPL,R16
//--------------------------
ldi dd8u,$38 ; 56 (десят.)
ldi dv8u,$2A ; 42 (десят.)
rcall div8u_c
nop
nop
nop
EndPrg: rjmp EndPrg
//----------------------------------------------------
;*****
div8u_c: sub drem8u,drem8u ;очистить остаток и перенос
ldi dcnt8u,9 ;инит.счетчик цикла
d8u_1: rol dd8u ;делимое/делитель сдвинуть влево
dec dcnt8u ;уменьш.счетчик на 1
brne d8u_2 ;переход если не ноль
ret
d8u_2: rol drem8u ;остаток сдвинуть влево
sub drem8u,dv8u ;остаток= остаток - делитель
brcc d8u_3 ;если рез-т ‹ 0
add drem8u,dv8u ;восст.остаток
clc ; сброс переноса для форм.рез-та
rjmp d8u_1 ;иначе
d8u_3: sec ;уст.перенос для форм.рез-та
rjmp d8u_1 ;вернуться назад
//----------------------------------------------------
И что же я получил ???
В регистре R16 = 1 (целое) - верно.
В регистре R15 = 0xE (вещественное) - НЕВЕРНО (!!!!?!?!?)
Попытался считать условно как десятичное, то в этом случае получается 14 (десят), что тоже НЕВЕРНО.
Попытался прикинуть что первый разряд двоичный после запятой - это двойка в минус первой степени, второй разряд двоичный после запятой - двойка в минус второй степени и т.д.
Ниже приведена конвертилка для ПК числе в вещественый формат:
#include‹stdio.h›
#include‹conio.h›
#include‹math.h›
//---------------------------------------------------
double ConvertByteToFloat(unsigned char A);
//---------------------------------------------------
void main(void)
{ clrscr();
int A=0xE; // Input hex number for convert to float number
printf("(hex)-› 0x%X , (dec)-› %d , %f",A,A,ConvertByteToFloat(A));
getch();
}
//---------------------------------------------------
double ConvertByteToFloat(unsigned char A)
{ double X=0;
if((A&0x1)==0x1) X=X+pow(2,-1);
if((A&0x2)==0x2) X=X+pow(2,-2);
if((A&0x4)==0x4) X=X+pow(2,-3);
if((A&0x
==0x
X=X+pow(2,-4);
if((A&0x10)==0x10) X=X+pow(2,-5);
if((A&0x20)==0x20) X=X+pow(2,-6);
if((A&0x40)==0x40) X=X+pow(2,-7);
if((A&0x80)==0x80) X=X+pow(2,-
;
return(X);
}
//---------------------------------------------------
Пробовал изменить порядок преобразования - все никак.
Заранее благодарю.
Мой e-mail:
DarkAngelDeath19@mail.ru