ЭУМК по дисциплине "Программирование проблемно-ориентированных вычислительных средств реального времени" › Теория › Тема 7. Программирование вычислений с плавающей запятой на процессорах с фиксированной запятой

# Электронный учебно-методический
комплекс по дисциплине
"Программирование проблемно-ориентированных вычислительных средств реального времени"

для специальности

1-40 02 02 «Электронные вычислительные средства»

Оглавление | Программа | Теория | Практика | Контроль знаний | Об авторах

7.3. Реализация операции умножения чисел с ПЗ
7.3.1. Алгоритм умножения чисел с плавающей запятой

Основу алгоритма операции сложения составляет выравнивание порядков слагаемых, а затем выполнение операции с нормализацией результата и коррекцией переполнения.
Основу алгоритма операции умножения составляет попарное перемножение старших и младших частей мантисс сомножителей с последующим их суммированием с соответствующим сдвигом и суммированием порядков.
Тогда алгоритм умножения чисел f1 = m1 · be1 и f2 = m2 · be2 может быть записан следующим образом:
f1 · f2 = m1 · m2 · b(e1+e2)
Процесс перемножения мантисс можно проиллюстрировать следующим рисунком (рис. 7.2):

###

### Рисунок 7.2 – Принцип умножения 32-разрядных мантисс

При этом учитывая, что первое произведение выходит за пределы 32-х старших разрядов и практически не влияет на результат, его можно не вычислять.
Учитывая что значения сомножителей равны A = AHI + ALO·2-15 и B = BHI + BLO·2-15, результат умножения формируется следующим образом A·B = AHI·BHI + (AHI·BLO+ALO·BHI)·2-15 + ALO·BLO·2-30.
Схема алгоритма умножения двух чисел с плавающей запятой А и В с формированием результата в С представлена на рисунке 7.3.

###

### Рисунок 7.3 – Алгоритм умножения чисел с плавающей запятой

7.3.2. Программная реализация умножения чисел с плавающей запятой

Пример программы с прямой адресацией вычисления произведения двух чисел с плавающей запятой представлен ниже.

    ; ППО ЭВС РВ Лекции
    ; (c) Клюс В.Б. 22/11/04 21:00
    ; Умножение с ПЗ
    	.mmregs				; Определение регистров
    	.def	_c_int00			; Метка начала программы
    	.align	80h			; Выровнять на начало страницы
    _c_int00:
    	ld	#ASIGN, DP			; Текущая страница
    	stm	#ASIGN, SP			; Указатель стека
    	st	#1, ONE
    	ssbx	SXM				; Расширение знака
    	rsbx	OVM				; Запрет коррекции переполнения
    	call	MULFLT
    	nop
    	nop
    	nop
    	nop
    MULFLT	stm	#ASIGN, ar2	; Адрес 1-го операнда
    	stm	#AHI, ar3			; Адрес AHI
    ;	rpt	#6
    ;	portr	PA0, *ar2+
    ;	portr	PA0, *ar2			; ar2 -> BLO
    UP	ld	AEXP, a			; Суммирование порядков
    	add	BEXP, a			;
    	stl	a, CEXP
    	ld	*ar2-, T			; T = BLO
    	mpyu	*ar3+, a			; a = BLO * AHI
    	macsu	*ar2, *ar3-, a		; a + BHI * ALO
    	sftl	a, -15, a
    	macsu	*ar2+, *ar3, a		; a + BHI * AHI
    	sftc	a
    	bcd	OK, aeq
    	dst	a, CHI			;1w
    	mar	*ar2+				;1w

    	bcd	SIGN, ntc
    	ld	CEXP, 16, a		;1w
    	or	ASIGN, a			;1w

    	sub	ONE, 16, a
    SIGN	xor	BSIGN, a
    OK	dst	a, CEXP			; CEXP | CSIGN
    ;	rpt	#7
    ;	portw	*ar2+, PA0
    	ret
    	.align	80h			; Выровнять на начало страницы
    ASIGN	.word	0				; 1-й операнд
    AEXP	.word	0
    AHI	.word	5555h				; двойное слово
    ALO	.word	2222h				; с четного адреса
    BSIGN	.word	-1				; 2-й операнд
    	.   .   .   .   .
    CLO	.word	0				; с четного адреса
    ONE	.word	0
    	.end					; Конец программы

Оглавление | Программа | Теория | Практика | Контроль знаний | Об авторах
© БГУИР , 2012