как умножить 16-ти разрядное число на 8 ми битное число?

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 7
Зарегистрирован: Вт май 06, 2014 06:36:12

Сообщение Tsiden »

в моем случае необходимо умножить регистровую пару на 196, на ассемблере, помогите :)
Реклама
Мучитель микросхем
Аватара пользователя
Сообщения: 462
Зарегистрирован: Пн фев 22, 2010 09:12:34

Сообщение ArtDen »

А в чём проблема-то? 196 = 4 + 64 + 128 = 2^2 + 2^6 + 2^7. Сдвигаешь, складываешь - и вуаля, всё готово.
http://ufa-darts.ru/ - приходи играть в дартс в Уфе
Контактная информация:
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

или так:
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
54 такта AVR
Ставим плюсы: )
Мучитель микросхем
Аватара пользователя
Сообщения: 462
Зарегистрирован: Пн фев 22, 2010 09:12:34

Сообщение ArtDen »

Кстати, да. Так быстрее
http://ufa-darts.ru/ - приходи играть в дартс в Уфе
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Померяемся? :)))
Спойлер

Код: Выделить всё

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
40 cyc
Это если в тиньках, в мегах еще 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
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

не не не) я не с целью помериться)))
Ставим плюсы: )
Реклама
pcb
Опытный кот
Сообщения: 833
Зарегистрирован: Пт авг 12, 2011 09:14:27
Откуда: Млечный путь/Земля/РФ/Екатеринбург

Сообщение pcb »

Я предлагаю:
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

на асме писать лень )
но имхо самая быстрая реализация будет :tea:
Разработал:
-BLDC
-ФУОЗ/МПСЗ
-SMART BMS
-ECU/EDC на STM32F4(43%)+CPLD(57%)
-Моноинжектор на ATSAMD20G16
-контроллер эффектов для RGB LED ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ
orinoko

Сообщение orinoko »

А у вашего неизвестного нам процессора есть умножение? Если да, то ещё проще

Сорри, не заметил, что уже есть ответ
Родился
Сообщения: 7
Зарегистрирован: Вт май 06, 2014 06:36:12

Сообщение Tsiden »

Спасибо Коты!!! :) :) :)
Ответить

Вернуться в «AVR»