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

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

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

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

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

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

Основу алгоритма операции сложения составляет выравнивание порядков слагаемых, а затем выполнение операции с нормализацией результата и коррекцией переполнения.
В общем виде число с плавающей запятой представляется в виде
f = m · be
где m - мантисса, b - основание, e - порядок.
Тогда алгоритм сложения/вычитания двух чисел f1 = m1 · be1 и f2 = m2 · be2 может быть записан следующим образом:
f1 ± f2 = (m1 ± m2 · b-(e1-e2)) · be1 , e1≥e2
f1 ± f2 = (m1 · b-(e2-e1) ± m2) · be2 , e1<e2
Схема алгоритма сложения двух чисел с плавающей запятой А и В с формированием результата в С (все числа в вышеприведенном формате) представлена ниже (рис. 7.1).

###

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

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

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

    ; ППО ЭВС РВ Лекции Сложение с ПЗ
    ; (c) Клюс В.Б. 16/11/04 21:00
    	.mmregs				; Определение регистров
    	.def	_c_int00			; Метка начала программы
    	.align	80h			; Выровнять на начало страницы
    _c_int00:
    	ld	#ASIGN, DP			; Текущая страница
    	ssbx	SXM				; Расширение знака
    	rsbx	OVM				; Запрет коррекции переполнения
    	call	ADDFLT
    	nop

    ADDFLT	stm	#ASIGN, ar2	; Адрес 1-го операнда
    ;	rpt	#7
    ;	portr	PA0, *ar2+
    UP	ld	AEXP, a			; Определение большего числа
    	sub	BEXP, a			; acc A = D
    	bc	AEQB, aeq
    	bc	ALTB, alt
    AGTB	neg	a
    	add	#16, a			; D = (16-D)
    	bcd	A1, aleq			; D > 15
    ; разность порядков < 16
    	stlm	a, T				;1w
    	nop					;1w
    	ld	BHI, TS, a			;
    	sth	a, BHI			; сдвиг BHI вправо на D
    	stl	a, TEMP			; выдвигаемые биты BHI
    	ld	BLO, TS, a			; сдвиг вправо BLO на D
    	sftl	a, -15, a			; убираем старший 0 в BLO
    	bd	A2
    	or	TEMP, a			;1w объединение с битами BHI
    	stl	a, BLO			;1w новое значение BLO
    ; разность порядков > 15
    A1	add	#16, a			; D = (32-D)
    	bcd	A3, aleq			; D > 31
    	stlm	a, T				;1w
    	nop					;1w
    	ld	BHI, TS, a
    	sth	a, BLO			; сдвиг BHI вправо на D (в BLO)
    	ld	#0, a
    	stl	a, BHI			; обнуление BHI
    A2	ld	ASIGN, a			; A > B
    	stl	a, CSIGN			; CSIGN = ASIGN
    	ld	ALO, 1, a
    	bd	CHKSGN
    	stl	a, ALO			;1w убираем старший 0 в ALO
    	ld	AEXP, a			;1w CEXP = AEXP
    ; A >> B -> C = A
    A3	ld	ASIGN, a			; A >> B
    	stl	a, CSIGN			; CSIGN = ASIGN
    	ld	AHI, a
    	stl	a, CHI			; CHI = AHI
    	ld	ALO, 1, a
    	bd	AROUND
    	stl	a, СLO			;1w CLO = ALO (без старшего 0)
    	ld	AEXP, a			;1w CEXP = AEXP
    ; порядки А и В равны
    AEQB	ld	ASIGN, a			; AEXP = BEXP
    	stl	a, CSIGN			; для одинаковых знаков
    	ld	ALO, 1, a
    	stl	a, ALO			; убираем старший 0 в ALO
    	ld	BLO, 1, a
    	bd	CHKSGN
    	stl	a, BLO			;1w убираем старший 0 в BLO
    	ld	AEXP, a			;1w CEXP = AEXP
    ALTB	add	#16, a			; D = (16-D)
    	bcd	B1, aleq			; D > 15
    ; разность порядков < 16
    	stlm	a, T				;1w
    	nop					;1w
    	ld	AHI, TS, a
    	sth	a, AHI			; сдвиг AHI вправо на D
    	stl	a, TEMP			; выдвигаемые биты AHI
    	ld	ALO, TS, a			; сдвиг вправо ALO на D
    	sftl	a, -15, a			; убираем старший 0 в ALO
    	bd	B2
    	or	TEMP, a			;1w объединение с битами AHI
    	stl	a, ALO			;1w новое значение ALO
    ; разность порядков > 15
    B1	add	#16, a			; D = (32-D)
    	bcd	B3, aleq			; D > 31
    	stlm	a, T				;1w
    	nop					;1w
    	ld	AHI, TS, a
    	sth	a, ALO			; сдвиг AHI вправо на D (в ALO)
    	ld	#0, a
    	stl	a, AHI			; обнуление AHI
    B2	ld	BSIGN, a			; B > A
    	stl	a, CSIGN			; CSIGN = ASIGN
    	ld	BLO, 1, a
    	bd	CHKSGN
    	stl	a, BLO			;1w убираем старший 0 в ALO
    	ld	BEXP, a			;1w CEXP = AEXP
    ; B >> A -> C = B
    B3	ld	BSIGN, a			; A >> B
    	stl	a, CSIGN			; CSIGN = BSIGN
    	ld	BHI, a
    	stl	a, CHI			; CHI = BHI
    	ld	BLO, 1, a
    	bd	AROUND
    	stl	a, СLO			;1w CLO = BLO (без старшего 0)
    	ld	BEXP, a			;1w CEXP = BEXP
    ;
    CHKSGN	stl	a, CEXP		; новый порядок
    	ld	ASIGN, a
    	sub	BSIGN, a			; сравнение знаков
    	bcd	ADNOW, aeq			; одинаковые знаки SUB
    	ld	ASIGN, b			;1w
    	stl	b, CSIGN			;1w
    	bc	AISNEG, alt
    BISNEG					; |A|-|B| если A>0, B<0
    	dld	AHI, a			; старший в двойном слове
    	dsub	BHI, a
    	bcd	CZERO, aeq
    	dst	a, CHI			;1w
    	nop					;1w
    	bc	CNEG, alt
    CPOS	bd	NORMAL
    	ld	#0, a				;1w
    	nop					;1w
    AISNEG					; |B|-|A| если A<0, B>0
    	dld	BHI, a			; старший в двойном слове
    	dsub	AHI, a
    	bc	CZERO, aeq
    	dst	a, CHI			;1w
    	nop					;1w
    	bc	CPOS, agt
    CNEG	abs	a
    	dst	a, CHI
    	bd	NORMAL
    	ld	#-1, a			;2w
    CZERO	bd	AROUND
    	stl	a, CSIGN			;1w acc A = 0
    	nop					;1w
    ADNOW	dld	AHI, a			; старший в двойном слове
    	dadd	BHI, a
    	bc	CZERO, aeq
    	dst	a, CHI			;1w
    	nop					;1w
    	bcd	AROUND1, anov
    	sftl	a, -1				;1w
    	nop					;1w
    ; переполнение при сложении
    OVFLOW	dst	a, CHI		;
    	ld	AEXP, a			; AEXP = BEXP
    	bd	AROUND
    	add	#1, a				;2w
    NORMAL	dld	CHI, b
    	exp	b
    	stl	a, CSIGN			;
    	ldm	T, a
    	neg	a
    	norm	b
    	bd	AROUND
    	dst	b, CHI			;1w
    	add	AEXP, a			;1w
    AROUND1	ld	AEXP, a		; AEXP = BEXP
    AROUND	stl	a, CEXP		; новый порядок
    ;	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-й операнд
    	.   .   .   .   .
    СLO	.word	0				; с четного адреса
    TEMP	.word	0
    	.end					; Конец программы

    ONE	.word	0

В данном примере нет проверки на специальные случаи еС и формат выходных данных несколько отличается от формата входных. Младшая часть суммы содержит данные без знака во всех разрядах CLO.
Для округления результата и приведения его в соответствие с форматом входных данных необходимо перед выводом данных (перед командой RPT) добавить следующие команды: .

    AROUND	stl	a, CEXP		; новый порядок
    	dld	CHI, a
    	add	ONE, 6, a
    	bcd	NOFL, anov
    	sth	a, CHI			;1w
    	sfta	a, -1				;1w
    	sth	a, CHI
    	sfta	a, -1
    	addm	#1, CEXP
    NOFL	and	#7FC0h,a
    	stl	a, CLO
    ;	rpt	#7

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