LINUX.ORG.RU

Умножение больших чисел и вывод в память

 80552, , , мк-51,


0

1

Пишу лабу по микропроцессорам, необходимо умножить и вывести в память содержимое регистра на константу(>#53). Ввод/вывод в память работает. Давно писал на х86 ассемблере умножение больших чисел - там можно было разделить регистр на младшую и старшую тетрады и оперировать с ними. В 8-битном мк-51, насколько я знаю, это невозможно.

org	0h
ajmp	begin
org	30h

;main
begin:	mov	p1,	#00100001b	; ввод через р0, р4 низкий - неактив, р5 ввод
	mov	r0,	#10h		; начальный адрес
	mov	r1,	#3              ; длина
      mov	r2,	#1		; счётчик перехода на след. байт
	inc	r1			
	
	;mov @r0, #55h
	;inc r0
	;mov @r0, #55h
	;inc r0
	;mov @r0, #55h
	
	mov r0, #10h
	
m2:	djnz	r1,	m1
	ajmp	begin

m1:	acall	read
	acall	save
	ajmp	m2

;functions
read:		
	MOV	R3,	#4	;счетчик бит в цифpе
	CLR	A		;A=0
IN:	JNB	P1.5,	IN	;ожидание запроса от ВУ
	SETB 	P1.4		;выдача сигнала готовности МК
	MOV	C,	P1.0	;ввод бита
	CLR	P1.4		;снятие сигнала готовности МК
	JB	P1.5,	$	;ожидание снятия запроса от ВУ
	RLC  	A		;задвинуть бит слева
	DJNZ	R3,	IN	;конец цикла ввода бита
	
ret

save:   
	cjne 	r2,	#1,	w2	;переход, в какую часть байта писать
	mov	r4,	a    		;сохранили
	mov	a,	@r0     	;взяли текущее значение памяти
	anl	a,	#11110000b 	;пишем в младший полубайт
	orl	a,	r4
	mov	@r0,	a
	push	acc
	clr	a
	inc	r2
	ajmp	e
w2:	swap	a    			;обмен тетрадами
	mov	r4,	a    		;сохранили
	mov	a,	@r0     	;взяли текущее значение памяти
	anl	a,	#00001111b     	;пишем в первую
	orl	a,	r4
	
	mov	@r0,	a
	inc r0		;переходим на след. полубайт
	push	acc
	clr	a
	dec	r2
e:
	;mov	r5,	#20h
;умножение и последующая запись в память
	push	r0
	mov	r0,	#20h
	mov	b,	#53
	pop	acc
	mul	ab
	mov	@r0,	a
	pop	r0
	inc	r5	
ret

END


Что сказать-то хотел?

anonymous
()
Ответ на: комментарий от laborant

а да. там переполнение происходит. как его обойти ?

есть три варианта:

1. обмазаться тетрадами. Но это сложно, если нет аппаратной поддержки. 9+9=18, т.е. возможен перенос. Лучше так не делать

2. хранить в одном байте число от 0 до 9.

3. забыть к чертям двоично-десятичную арифметику, и юзать двоичную. Оно проще.

emulek
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.