ЭУМК по дисциплине "Проектирование проблемно-ориентированных вычислительных средств" › Практика › Практическое занятие "Группа команд работы с аккумулятором"

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

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

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

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

9. Директивы ассемблера для задания переменных, программы суммирования элементов.
1) Директивы ассемблера: задание констант в программе

1. директива .set(.equ) – присвоить переменной числовое значение
   формат: имя переменной .set значение ;
2. директива .asg - присвоить символьное значение переменной
   формат: .asg [“]символьная строка[“], имя переменной ;
3. директива .eval– вычислить и присвоить значение переменной
   формат: .eval выражение, имя переменной .
4. директива .mmregs– определят адреса регистров процессора и некоторых периферийных устройств, отображаемых на память.

Поскольку директива .asg присваивает символьное значение, то конечный результат зависит от порядка переменных в выражении. Для получения однозначного результата можно использовать скобки. При этом директива .asg является единственной директивой, которая может ссылаться вперед.
Директива .set(.equ) в отличие от директив .asg и .eval не может переприсвоить значение переменной, определенной ранее.
Директива .eval обычно используется при повторении команд и директив с изменяющимися параметрами при использовании директив .loop и .endloop.

    ; ППО ВС Практическое занятие №9 (Часть 1)
    ; (c) Клюс В.Б. 17/01/07 18:20
    ; Задание констант в программе
    	.def	_c_int00		; Метка начала программы
    x1	.set	10h			; x1 = 10h
    x2	.set	x1+8h			; x2 = 10h+8h  = 18h
    	.asg	x1+8h, x3		; x3 = x1+8h   = 18h
    	.asg	(x1+8h), x4		; x4 = (x1+8h) = 18h
    ;y1	.set	Smem			; Недопустима ссылка вперед
    ;	.eval	Smem, y2		; Недопустима ссылка вперед
    	.asg	Smem, y3		; Допускается ссылка вперед
    	.text				; Секция программы
    _c_int00:				; Начало программы
    	ld	#Smem, DP		; Текущая страница данных
    	st	#2*x2, Smem		; Сохранить 2*18h     = 30h
    	st	#x2*2, Smem+1		; Сохранить 18h*2     = 30h
    	st	#2*x3, Smem+2		; Сохранить 2*x1+8h   = 28h
    	st	#x3*2, Smem+3		; Сохранить x1+8h*2   = 20h
    	st	#2*x4, Smem+4		; Сохранить 2*(x1+8h) = 30h
    	st	#x4*2, Smem+5		; Сохранить (x1+8h)*2 = 30h
    	stm	#y3, ar3		; Сохранить в регистр  Smem
    	nop				; Точка останова
    	.data				; Секция данных
    	.align	80h			; Выровнять на начало страницы
    	.eval	0, x			; Присвоить начальное значение
    Smem					; Массив данных
    	.loop	8			; Повторить директивы
    	.word	x			; Зарезервировать слово
    	.eval	x+1, x			; Увеличить значение
    	.endloop			; Конец повторяемого блока
    	.end				; Конец программы

2) Программа нахождения суммы элементов массива

1. массив может находиться в памяти данных, читаться из последовательного или параллельного портов;
2. сумма может быть записана в память данных после массива, после счетчика или по заданному адресу, а также выведена в последовательный или параллельный порт;
3. число элементов массива может задаваться константой (директива .set) или выбираться из ячейки памяти (директива .word). Внимание! Значение, занесенное во вспомогательный регист командами STM и MVDK, может использоваться в качестве адреса в следующей команде, а занесенное любыми другими командами - только через один такт;
4. складываемые числа могут быть целыми со знаком (из диапазона -32768...+32767), целыми беззнаковыми (положительными из диапазона 0...+65535) и дробными со знаком (беззнаковых не бывает, из диапазона -1.0...+1.0-2-15). При сложении дробных чисел можно сохранять 16 разрядов (если не помещается в 16 разрядов, то это переполнение). Беззнаковые числа складываются командой ADDS без учета бита расширения знака SXM;
5. цикл может быть организован с помощью команд BANZ[D] или RPTB[D], а для повторения одной команды может быть использована команда RPT(RPTZ).

Используемые команды:

    ; 1 - вход:  a) память, b) McDRR, c) PA
    ; 2 - выход: a) память, b) McDXR, c) PA
    ; 3 - счетчик: a) .set, b) .word
    ; 4 - данные: a) знаковые(Ц), b) беззнаковые(Ц), c) дробные(З)
    ; 5 - цикл: a) BANZ, b) RPTB

    McDRR0	.set	21h		;1b Приемник   МБПП 0
    McDXR0	.set	23h		;2b Передатчик МБПП 0
    McDRR1	.set	41h		;1b Приемник   МБПП 1
    McDXR1	.set	43h		;2b Передатчик МБПП 1
    PAinp	.set	25		;1c Параллельный порт
    PAout	.set	26		;2c Параллельный порт

    Cnt	.set	8-1		;3a Число элементов массива -1
    CNT	.word	8-1		;3b Число элементов массива -1

    	ssbx	SXM		;4ac Знаковая арифметика		(1)
    	rsbx	SXM		;4b  Беззнаковая арифметика		(1)

    	stm	#Cnt, ar1	;3a5a Длина массива данных (счетчик)	(2)
    	stm	#Cnt, BRC	;3a5b Длина массива данных (счетчик)	(2)
    	mvdm	CNT, ar1	;3b5a Длина массива данных (счетчик)	(2)
    	mvdm	CNT, BRC	;3b5b Длина массива данных (счетчик)	(2)

    	rptb	loop2-1		;5b Повторить до loop2 пока BRC<>0	(2)
    loop1:				;5a Начало цикла для banz
    ; Ввод и суммирование
    	add	*ar2+, a	;1a4ac Суммирование			(1)
    	adds	*ar2+, a	;1a4b  Суммирование			(1)
    	add	McDRR0, a	;1b4ac Cуммирование (DP=0 для MMR)	(1)
    	adds	McDRR0, a	;1b4b  Cуммирование (DP=0 для MMR)	(1)
    loop2:				;5b Окончание цикла для rptb
    	banz	loop1, *ar1-	;5a Повторить пока ar1<>0		(2)
    CNT	.word	8-1		;3b Число элементов массива -1		(1)

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