;------------------------------------------------------------- ; АВТОР: Баскаков Аркадий ; УЧЕБНАЯ ГРУППА: ВСМУ-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