16+
Четверг
13 декабря
Вход |Карта сайта | |Upload |codebook | PARTS

 О смысле всего сущего 0xFF

 Средства и методы разработки

 Мобильная и беспроводная связь

 Блошиный рынок Объявления

caxapa

Микроконтроллеры ARM 

AVR PIC MSP PLD,FPGA,DSP 

Кибернетика Технологии 

Схемы, платы, компоненты 

Микроконтроллеры AVR

 
   Новая тема Правила Регистрация Поиск »» Архив
Вернуться в конференциюТопик полностью
m16_home  (29.10.2013 23:05) , в ответ на Мой давний опыт проекта на ассемблере, 64К кода, оказался очень полезен, чтобы понять, что он бесполезен. А на десятках команд нет шансов этого понять, нужно непременно повторить ;) автор: Vladimir Ljaschko
согласен, если пользовать 32 8-ми битных регистра + тройку 16-ти битных . это из серии asm vs c но тем не мене потратьте пару минут. 
1. в регистровом файле обозначил 16 16-ти разрядных регистра A0,A1 B0,B1....G0,G1 и восемь 32-х разрядных dA, dB, dC .... dG. 2. написал макросы команд для 16-ти и 32-х разрядных операций по мнемонике сходными с ассемблером AVR , например ldi r16, 0xfa -> ldi_w E0,0xfdec -> ldi_d dF, 0x aabbccdd и тд. 3. библиотеку написал тоже в виде макросов :
;****************** 48 bit - Word&Doudle ******************
		div_wd_wd			//   G0 : dF = G0 : dF  /  G1 : dE
............................
		div_wd_d			//   G0 : dF = G0 : dF  /  dE
............................
		div_wd_w			//   G0 : dF = G0 : dF  /  E0
............................
		div_wd_b			//   G0 : dF = G0 : dF  /  E0l
............................
		divs_wd_wd		//   G0 : dF = G0 : dF  /  G1 : dE (signed)
............................
		divs_wd_d			//   G0 : dF = G0 : dF  /  dE (signed)
............................
		divs_wd_w			//   G0 : dF = G0 : dF  /  E0 (signed)
............................
		divs_wd_b			//   G0 : dF = G0 : dF  /  E0l (signed)
;****************** Double ********************************
		sqrt_d			//  dB = sqrt (dB )
............................
		mul_d_d			//  dG : dF = dH * dE
............................
		muli_d_d		1234	//  dG : dF = dH * K(32)
............................
		muls_d_d			//  dH : dG = dF * dE (signed)
............................
		mulsi_d_d		1234	//  dH : dG = dF * K(32) (signed)
............................
		mul_d_w			//  G0 : dF = dH * E0
............................
		muli_d_w		1234	//  G0 : dF = dH * K(16)
............................
		muls_d_w			//  H0 : dG = dF * E0 (signed)
............................
		mulsi_d_w		1234	//  H0 : dG = dF * K(16) (signed)
............................
		mul_d_b			//  G0 : dF = dH * tA
............................
		muli_d_b		123	//  G0 : dF = dH * K(8)
............................
		div_d			//  dF = dF  / dE
............................
		divi_d		1234	//  dF = dF  /  K(32)
............................
		div_d_w			//  dF = dF  / E0
............................
		divi_d_w		1234	//  dF = dF  / K(16)
............................
		div_d_b			//  dF = dF  / E0L
;****************** Word **********************************
		sqr_w			// dB = E0**2		
...........................
		sqr_w_s			// dB = E0**2 + E0**2 ..... + E0**2
...........................
		mul_w			// dF = E1 * E0
...........................
		muli_w		1234	// dF = E1 * K(16)
...........................
		mul_w_b			// dF = E1 * E0L
...........................
		muls_w			// dF = E1 * E0 (signed)
...........................
		mulsi_w		1234	// dF = E1 * K(16) (signed)
...........................
		muls_w_b			// dF = E1 * E0L (signed)
...........................
		mulsi_w_b		12	// dF = E1 * K(8) (signed)
...........................
		div_w			// E0 = E0 / E1
...........................
		divi_w		1234	// E0 = E0 / K(16)
...........................
		divs_w			// E0 = E0 / E1 (signed)
...........................
		divsi_w		1234	// E0 = E0 / K(16) (signed)
...........................
;		E0 = (digit)
		itoa_16u		0,5,3	
...........................
;		E0 = (digit signed)
		itoa_16s		0,5,3	
...........................
;		E0l = (digit signed)
		itoa_8s		0,5,3	
3. на написание полинома ушло минут 10.
;**********************************************************
;		Constant
;**********************************************************
.equ	k1	= 158850330	// 977DD1A
.equ	k2	= 1104840		// 0x10DBC8
.equ	k3	= 1373		// 0x55D
.equ	k4	= 3

.equ	kp1	= 10
.equ	kp2	= 1000000000	// 0x3B9ACA00

.equ	kt	= 200		// 0xC8;**********************************************************
;	S  -  (k1 + k2*spt + k4*spt^3/kp1  -  k3*spt^2 )*( temper - kt )  /   kp2

calc_sprt:	clr_w		D0
..........................................
;	k1

		ldi_d		dE, k1
		mov_d		dC, dE		// summary= k1
..........................................
;	k2*spt
		ldi_d		dH, k2
		lds_w		E0, spt_curr
		mul_d_w				//  G0 : dF = dH * E0

		summary		G0, dF		// summary= k1 + k2*sprt
..........................................
;	sprt^2
		mov_w		E1, E0
		mul_w				// dF = E1 * E0
		push_d		dF		// story  sprt^2
..........................................
;	sprt^3
		mov_d		dH, dF
		mul_d_w				//  G0 : dF = dH * E0//  G0:dF = sprt^3

..........................................
;	sprt^3*k4
		ldi		tmpA, k4
		mov_d		dH, dF
		mul_d_b				//  G0 : dF = dH * tmpA
..........................................
;	sprt^3*k4/kp1

		ldi		tmpA, kp1
		div_wd_b				//   G0 : dF = G0 : dF  /  E0l		
			
		summary		G0, dF		// summary  = k1 + k2*spt + sprt^3*k4/kp1
..........................................
;	k3*spt^2
		ldi_w		E0, k3
		pop_d		dH		//  dH = sprt^2
		mul_d_w				//  G0 : dF = dH * E0

		sub_d		dC, dF
		sbc_w		D0, G0		// summary  = k1 + k2*spt + sprt^3*k4/kp1 - k3*spt^2
..........................................
;	temper - kt

		lds_w		E0, temper
		ldi_w		E1, kt
		sub_w		E0, E1
..........................................
;	(k1 + k2*spt + k4*spt^3/kp1  -  k3*spt^2 )*( temper - kt )

		mov_d		dF, dC
		muls_d_w				//  H0 : dG = dF * E0
..........................................
;	(k1 + k2*spt + k4*spt^3/kp1  -  k3*spt^2 )*( temper - kt ) /   kp2

		ldi_d		dE, kp2
		mov_d		dF, dG
		mov_w		G0, H0

		divs_wd_d				//   G0 : dF = G0 : dF  /  dE (signed)
..........................................

;	S  -  (k1 + k2*spt + k4*spt^3/kp1  -  k3*spt^2 )*( temper - kt )  /   kp2

		lds_w		E0, spt_curr
		sub_w		E0, F0

		sts_w		spt_20, E0	//  store result

		ret
Главная | Карта сайта | О проекте | Проекты | Файлообменник | Регистрация | Вебмастер | RSS
Лето 7527 от сотворения мира. При использовании материалов сайта ссылка на caxapу обязательна.
MMI © MMXVIII