;-------------------------------------------------------------
; АВТОР: Баскаков Аркадий
; УЧЕБНАЯ ГРУППА: ВСМУ-9-07
; ДАТА ПОСЛЕДНЕГО ИЗМЕНЕНИЯ: 24 сентября 2009
; ОПИСАНИЕ: Вариант 1
; Определить сумму положительных
; элементов массива из 10
; целочисленных констант.
;
; Пока нет проверки на переполнение.
; В этом случае выдает '>9'.
;-------------------------------------------------------------
lab1 start 0
begin j go
; ТЕСТОВЫЕ МАССИВЫ
.array word 0,0,0,0,0,-3 ; нет положительных!
.array word 5,0,-3,0,2 ; =7
;array word 1 ; =1
;array word 0 ; нет положительных!
.array word 1,2,3,4,5,6,7,8,9,10 ; >9!
array word 20000,20000,12345,32767,32768 ; ? переполнение (overflow)
; ОБЪЯВЛЕНИЕ ПЕРЕМЕННЫХ И КОНСТАНТ
dim word *-array ; размер массива (должно быть сразу после определения массива)
zero word 0 ; константа 0
one word 1 ; константа 1
summa resw 1 ; выделение 1 машинного слова под переменную суммы
displ byte x'01' ; код дисплеяя
ret resw 1 ; адрес возврата
; ОБЪЯВЛЕНИЕ СТРОК
hdr byte 10,13,c'ЛР1 Баскаков Аркадий ВСМУ-9-07 Вариант 1',10,13,0
wrn byte c'Положительных элементов нет',10,13,0
msg byte c'Сумма равна ',0
err byte c'Сумма больше 9',10,13,0
derr equ *-err
; НАЧАЛО ИСПОЛНЯЕМОЙ ЧАСТИ
go stl ret
ldx zero ; обнуляем регистр X
lda zero ; обнуляем регистр A
stx summa ; обнуляем сумму
; ВЫВОД ЗАГОЛОВКА
outhdr ldch hdr, x ;
comp zero ;
jeq endhdr ;
wd displ ;
tix zero ;
j outhdr ;
endhdr ldx zero ; обнуляем регистр X
lda zero ; обнуляем регистр A
; СКАНИРОВАНИЕ МАССИВА
loop lda array, x ; заносим в регистр A первый элемент массива array
comp zero ; сравниваем с нулем
jgt addion ; если >0 (greater) переходим к суммированию,
; т.е. на метку addion
; ПЕРЕХОД К СЛЕДУЮЩЕМУ ЭЛЕМЕНТУ МАССИВА
next tix one ; передвигаемся на 1 байт
tix one ; еще на 1 байт
tix dim ; и еще на 1 байт
jlt loop ; если текущий индекс < dim, то возвращаемся в начало цикла
j analys ; иначе выходим из цикла для анализа результата
; ПРОЦЕСС СУММИРОВАНИЯ
addion add summa ; прибавляем summa к текущему содержимому A
sta summa ; записываем в summa содержимое регистра A
j next ; переходим к следующему элементу массива
; АНАЛИЗ РЕЗУЛЬТАТА
analys ldx zero ; заранее обнуляем регистр X (для будущих выводов строк)
; 1) ПОЛУЧЕННАЯ СУММА ДВУЗНАЧНОЕ ЧИСЛО?
lda #10 ; загружаем в регистр A число 10
comp summa ; сравниваем 10 с суммой
jlt outerr ; если 10 < summa, то переход к сообщению об ошибке (>9)
; 2) ПОЛУЧЕННАЯ СУММА РАВНА 0?
lda summa ; загружаем сумму в A
comp zero ; сравниваем окончательную сумму с нулем
jeq outwrn ; если summa = 0, то вывод на экран, что нет положительных элементов
outmsg ldch msg, x ;
comp zero ;
jeq outsum ;
wd displ ;
tix zero ;
j outmsg ;
; ВЫВОД СУММЫ
outsum lda summa ;
add #48 ; прибавляем ASCII-код нуля (нужен для вывода числа)
wd displ ;
j finish ;
; ВЫВОД 'ПОЛОЖИТЕЛЬНЫХ ЭЛЕМЕНТОВ НЕТ'
outwrn ldch wrn, x ;
comp zero ;
jeq finish ;
wd displ ;
tix zero ;
j outwrn ;
; ВЫВОД 'СУММА > 9'
outerr ldb #derr
ldch err, x ;
comp zero ;
jeq finish ;
wd displ ;
tixr b ;
j outerr ;
; ЗАВЕРШЕНИЕ ПРОГРАММЫ
finish ldl ret
rsub
end begin