Цитата(showone @ Jan 22 2007, 16:45)

Цитата
Вот библиотека с умножения положительных чисел с фиксированной запятой
UMN2_2B - ПРОГРАММА УМНОЖЕНИЯ 2 БАЙТОВОГО ЧИСЛА НА 2 БАЙТОВОЕ.
UMN -ПРОГРАММА УМНОЖЕНИЯ 6 БАЙТОВОГО ЧИСЛА НА 2 БАЙТОВОЕ.
причем из UMN2_2B можно сделать умножение n-БАЙТОВОГО ЧИСЛА НА m-БАЙТОВОЕ.
Но всеже лучше помоему перейти на Си и воспользоваться стандартной библиотекой с плавающей
точкой Keil или IAR.
тут критерий есть, писать только на АСМ, т.к. это вставка в проект, который уже написан на АСМ.
а эта вставка должна выполнять мат операции с числами с фикс запятой.
а т.к. используется C8051F121, то там есть встроенный перемножитель 16*16, т.е. два на два байта.
а мне нужно перемножать 3-и на два байта или три на три байта сфиксированной запятой.
просто раньше так глубоко не влезал в математику для контроллеров.
вот пришлось :-)
всем спасибо за ответ !!!!
Если вдруг еще актуально.
Умножение можно производить по тому же алгоритму что и умножение столбиком, только если там переполнение которое потом складывается с следующим результатом - это десятки числа, то в
данном случае это старшие два байта числа получившиеся после перемножения. Вот как выглядит
наш столбик:
0x0000 FF01 456D 567E
x
0x556C 5E67
____________________
Вот пример процедуры умножения в DS80C390, там тоже есть встроенный
перемножитель 16*16
Процедура умножения 32*16
Вход:
Первый множитель BUFF1 - массив 8 байт (число лежит- младший байт в младшем адресе).
Второй множитель BUFF2 - массив 8 байт (число лежит- младший байт в младшем адресе).
Во внутренних регистрах перемножителя:
MB - двухбайтовый регистр первого множителя
MA - двухбайтовый регистр второго множителя он же четырехбайтовый регистр
результата умножения.
UMN__4__2:
UMN_DP_2B_4B:
mov R1,#BUFF2
mov R0,#BUFF1
mov R3,#2
;----------
clr a
push a ;2 push
push a
;----------
clr c
UMN_DP2:
anl MCNT1,#0EFH ;CLM
mov MB,@R1
inc R1
mov MB,@R1
dec R1
mov MA,@R0
inc R0
mov MA,@R0
UMN_DP2_1:
mov A,MCNT1 ; это внутренний флаг окончания процедуры умножения 16*16
jb ACC.7,UMN_DP2_1
inc R0
mov BUFF2+4,MA
mov BUFF2+5,MA
mov BUFF2+6,MA
mov BUFF2+7,MA
clr c
pop a
mov b,a
pop a ;12 pop
addc a,BUFF2+7
mov BUFF2+7,a
mov a,b
addc a,BUFF2+6
mov BUFF2+6,a
clr a
addc a,BUFF2+5
mov BUFF2+5,a
clr a
addc a,BUFF2+4
mov BUFF2+4,a
mov a,BUFF2+7
push a
mov a,BUFF2+6
push a
mov a,BUFF2+5 ;24 push
push a
mov a,BUFF2+4
push a
;!!!!!!;!!!!!!;!!!!!!;!!!!!!
djnz R3,UMN_DP2 ;!!!!!
;!!!!!!;!!!!!!;!!!!!!;!!!!!!
;*******************
mov R0,#BUFF1+5 ;****
mov R3,#6 ;****
UMN_DP2_3: ;****
pop a ;****
mov @R0,a ;**** ;8 pop
dec R0 ;****
djnz R3,UMN_DP2_3 ;****
;*******************
RET