All pastes #2086767 Raw Edit

Unnamed

public text v1 · immutable
#2086767 ·published 2011-10-04 17:21 UTC
rendered paste body
;-------------------------------------------------------------
;                     АВТОР: Баскаков Аркадий
;            УЧЕБНАЯ ГРУППА: ВСМУ-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