Mnożenie i dodawanie wielobajtowe 8051

To forum jest dla wszystkich pasjonatów wiecznie młodych mikrokontrolerów '51. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
kaliska5
Użytkownik
Posty: 348
Rejestracja: 01 maja 2008, 8:24
Lokalizacja: z nienacka
Kontakt:

Mnożenie i dodawanie wielobajtowe 8051

Post autor: kaliska5 » 12 lis 2010, 16:44

Witam.Mam problem z mnożeniem 2 liczb 16bit.Czytałem w necie rożne artykuły i fora ale jeszcze bardziej sobie namieszałem.Mam 2 liczby: 2000H i 2DA7H chcąc je wymnożyć muszę mnożyć każdy bajt z każdym,potem suma wszystkich wyników.To co udalo mi sie naskrobac:

Kod: Zaznacz cały

mov 32H,#00H			;mlodsza polowka 8192 
mov 33H,#20H
mov 34H,#0A7H
mov 35H,#02DH

mov A,32H			;mnozenie 00H i A7H 
mov B,34H			
mul AB
mov R0,A
mov R1,B			;wynik w R1=high R0=low
mov A,34H
mov B,33H			;mnozenie A7 i 20H
mul AB
mov R2,A
mov R3,B			;wynik R2=low i R3 = high
mov A,35H
mov B,32H
mul AB
mov R4,A
mov R5,B
mov A,35H
mov B,33H
mul AB
mov R6,A
mov R7,B
Czy ktoś mógłby mi wytłumaczyć jak to wszystko dodać ?

Awatar użytkownika
Luminofor
Użytkownik
Posty: 1373
Rejestracja: 27 lis 2007, 17:17
Lokalizacja: Polska

Post autor: Luminofor » 12 lis 2010, 21:23

Jeżeli to DSM-51 to ma w ROM-ie zapisane procedury do mnożenia liczb wielobajtowych.

kaliska5
Użytkownik
Posty: 348
Rejestracja: 01 maja 2008, 8:24
Lokalizacja: z nienacka
Kontakt:

Post autor: kaliska5 » 12 lis 2010, 23:22

To nie DSM, goły procek.

gomarko
-
Posty: 71
Rejestracja: 13 paź 2010, 21:20
Lokalizacja: Konin

Post autor: gomarko » 13 lis 2010, 0:06

Może się przyda (działa na 100%)

Kod: Zaznacz cały

;====================================================================
; MNOZENIE_2_2  mnożenie 2bajty x 2bajty bez znaku
;
; wejście:    	R1, R0 = mnożna (x) (R0 młodszy bajt)
;           	R3, R2 = mnożnik (y) (R2 młodszy bajt)
;
; wyjście:   R3, R2, R1, R0 =wynik mnożenia (R3 najstarszy bajt)
;
; zmienia:   ACC, C
;====================================================================
MNOZENIE_2_2:
	PUSH	B
	PUSH	DPL
	MOV	A,R0
	MOV	B,R2
	MUL	AB	; mnożenie xL x yL
	PUSH	ACC	; wynik na stos (low byte)
	PUSH	B	; wynik na stos (high byte)
	MOV	A,R0
	MOV	B,R3
	MUL	AB	; mnożenie xL x yH
	POP	00H
	ADD	A,R0
	MOV	R0,A
	CLR	A
	ADDC	A,B
	MOV	DPL,A
	MOV	A,R2
	MOV	B,R1
	MUL	AB	; mnożenie xH x yL
	ADD	A,R0
	MOV	R0,A
	MOV	A,DPL
	ADDC	A,B
	MOV	DPL,A
	CLR	A
	ADDC	A,#0
	PUSH	ACC	; zachowaj pośrednie przeniesienie
	MOV	A,R3
	MOV	B,R1
	MUL	AB	; mnożenie xH x yH
	ADD	A,DPL
	MOV	R2,A
	POP	ACC	; pobierz przeniesienie
	ADDC	A,B
	MOV	R3,A
	MOV	R1,00H
	POP	00H	; retrieve result low byte
	POP	DPL
	POP	B
	RET			
;====================================================================

kaliska5
Użytkownik
Posty: 348
Rejestracja: 01 maja 2008, 8:24
Lokalizacja: z nienacka
Kontakt:

Post autor: kaliska5 » 13 lis 2010, 12:42

Dzięki za kod.Czy ktoś mógłby mi wytłumaczyć dodawanie wielobajtowe? . Wiem ze do tego służy ADDC ale nikt nam go na omówieniu nie wytłumaczył i nie bardzo wiem jak go używać

ODPOWIEDZ