как умножить 16-ти разрядное число на 8 ми битное число?
- Сообщения: 7
- Зарегистрирован: Вт май 06, 2014 06:36:12
в моем случае необходимо умножить регистровую пару на 196, на ассемблере, помогите 
- Реклама
- Сообщения: 462
- Зарегистрирован: Пн фев 22, 2010 09:12:34
А в чём проблема-то? 196 = 4 + 64 + 128 = 2^2 + 2^6 + 2^7. Сдвигаешь, складываешь - и вуаля, всё готово.
http://ufa-darts.ru/ - приходи играть в дартс в Уфе
или так:
x*196 = x*(256 - 60) = x*(256 - 64 + 4) = x*256 - x*64 + x*4
x*256 - сдвиг влево на 8 бит
x*64 - сдвиг влево на 6 бит
x*4 - сдвиг влево на 2 бита54 такта AVR
x*196 = x*(256 - 60) = x*(256 - 64 + 4) = x*256 - x*64 + x*4
x*256 - сдвиг влево на 8 бит
x*64 - сдвиг влево на 6 бит
x*4 - сдвиг влево на 2 бита
Спойлер
Код: Выделить всё
;r16, r17 - исходное число
;r16, r17, r18 - результат
;r19, r20, r21 - временные регистры
mul16_196:
push r19
push r20
push r21
;сохраняем исходное значение
push r16
push r17
;берем для расчетов исходное число
clr r19
mov r20, r16
mov r21, r17
;умножение на 256 / вместо сдвига на 8, сдвигаем байты
mov r18, r17
mov r17, r16
clr r16
;умножение на 64 / вместо сдвига влево на 6, сдвиг вправо на 2
lsr r21
ror r20
ror r19
lsr r21
ror r20
ror r19
;вычитание (x*256 - x*64)
sub r16, r19
sbc r17, r20
sbc r18, r21
;восстанавливаем исходное значение
clr r21
pop r20
pop r19
;умножение на 4 / сдвиг влево на 2
lsl r19
rol r20
rol r21
lsl r19
rol r20
rol r21
;сложение (x*256 - x*64) + x*4
add r16, r19
adc r17, r20
adc r18, r21
pop r21
pop r20
pop r19
ret
Ставим плюсы: )
- Сообщения: 462
- Зарегистрирован: Пн фев 22, 2010 09:12:34
Померяемся?
40 cyc
Это если в тиньках, в мегах еще MUL есть (22 такта):
Спойлер
Код: Выделить всё
MULT:
;XH:XL - исходное число
;YH,YL,R17 - временные регистры
;XH:XL:R16 - результат
PUSH R17 ;сохраняем регистры...
PUSH YH
PUSH YL
CLR R16 ;умножаем на 128
LSR XH
ROR XL
ROR R16
MOV YL,R16 ;сохраняем промежуточный результат
MOV YH,XL
MOV R17,XH
LSR R17 ;делим на 2
ROR YH
ROR YL
ADD R16,YL ;результат (х*64) складываем с (х*128)
ADC XL,YH
ADC XH,R17
LSR R17 ;делим еще на 16
ROR YH
ROR YL
LSR R17
ROR YH
ROR YL
LSR R17
ROR YH
ROR YL
LSR R17 ;получаем x*4
ROR YH
ROR YL
ADD R16,YL ;складываем с результатом
ADC XL,YH ;итого х=х*128+х*64+х*4
ADC XH,R17
POP YL ;восстанавливаем регистры, если надо...
POP YH
POP R17 ;34 команды @ 40 тактов
RET
Это если в тиньках, в мегах еще MUL есть (22 такта):
Спойлер
Код: Выделить всё
MULT:
;XH:XL - исходное число
;R16,R17,R0 - временные регистры
;R1:XH:XL - результат
PUSH R0
PUSH R16
PUSH R17
MOV R17,XH
LDI R16,196
MUL XL,R16 ;умножаем столбиком младший байт на 196
MOVW XL,R0
MUL R17,R16 ;и старший
ADD XH,R0 ;суммируем, получаем результат
CLR R0
ADC R1,R0
POP R17
POP R16
POP R0
RET
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
- Реклама
не не не) я не с целью помериться)))
Ставим плюсы: )
Я предлагаю:
X1X0*256(1)-X1X0*60(2)
(1) просто сдвиг всей переменной на 8 бит влево
Y2=X1
Y1=X0
Y0=0
(2) очень легко получается сдвиг и сложение 111100=64+32+16+8
тоесть:
X2X1X0<<3
ZZZ+=x
X2X1X0<<1
ZZZ+=x
X2X1X0<<1
ZZZ+=x
X2X1X0<<1
ZZZ+=x
Y2Y1Y0
-
X2X1X0
на асме писать лень )
но имхо самая быстрая реализация будет
X1X0*256(1)-X1X0*60(2)
(1) просто сдвиг всей переменной на 8 бит влево
Y2=X1
Y1=X0
Y0=0
(2) очень легко получается сдвиг и сложение 111100=64+32+16+8
тоесть:
X2X1X0<<3
ZZZ+=x
X2X1X0<<1
ZZZ+=x
X2X1X0<<1
ZZZ+=x
X2X1X0<<1
ZZZ+=x
Y2Y1Y0
-
X2X1X0
на асме писать лень )
но имхо самая быстрая реализация будет
Разработал:
-BLDC
-ФУОЗ/МПСЗ
-SMART BMS
-ECU/EDC на STM32F4(43%)+CPLD(57%)
-Моноинжектор на ATSAMD20G16
-контроллер эффектов для RGB LED ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ
-BLDC
-ФУОЗ/МПСЗ
-SMART BMS
-ECU/EDC на STM32F4(43%)+CPLD(57%)
-Моноинжектор на ATSAMD20G16
-контроллер эффектов для RGB LED ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ
А у вашего неизвестного нам процессора есть умножение? Если да, то ещё проще
Сорри, не заметил, что уже есть ответ
Сорри, не заметил, что уже есть ответ
- Сообщения: 7
- Зарегистрирован: Вт май 06, 2014 06:36:12


