Сумма положительных элементов над главной диагональю матрицы - Assembler

Узнай цену своей работы

Формулировка задачи:

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

Решение задачи: «Сумма положительных элементов над главной диагональю матрицы»

textual
Листинг программы
org 100h
jmp start
 
mess0  db   13,10,'Positive summ: $'   ; текст мессаги
 
mass   db   100, 018, -66, 043, 078    ; матрица 5х5
       db   051, -10, 123, -77, 005
       db   060, 001, -94, -19, 038
       db   099, 086, 022, 010, -49
       db   055, -66, 050, 119, 121
 
start:
   mov   cx,5               ; CX = счётчик цикла (5 столбцов в матрице)
   mov   si,mass            ; SI = адрес начала массива (для lodsb)
   push  0  0  0            ; в АХ будем читать, в ВХ будет сумма, DX = сл.строка
   pop   ax bx dx           ;   ..пока очищаем их (AX/BX/DX = нуль)
   dec   dx                 ; цикл будет увеличивать DX,
next:                       ;   ..поэтому ставим -1, чтоб начать с нуля.
   push  cx                 ; запомним счётчик..
   inc   dx                 ; DX + 1
   add   si,dx              ; SI = адрес матрицы + смещение сл.элемента
adding:                     ; внутренний цикл (суммирование)
   lodsb                    ; читаем в AL байт из SI
   or    al,al              ; проверка AL (эта операция взводит флаги)
   js    negate             ; переход, если флаг SF=1 (число отрицательное)
   add   bx,ax              ; иначе: сумма положительных в ВХ
negate:                     ;
   loop  adding             ; мотает цикл, пока СХ > 0
   pop   cx                 ; восстанавливаем счётчик
   dec   cx                 ; уменьшаем его для сл.строки
   jnz   next               ; мотаем внешний цикл, пока CX > 0
                            ;
   mov   ah,9               ; мессага
   mov   dx,mess0           ;
   int   21h                ;
   xchg  ax,bx              ; отправляем полученную сумму в AX
   call  outHex             ; зовём функцию "вывода числа на экран"
   mov   al,'h'             ; вставляем после числа литтер "HEX"
   int   29h                ;
 
exit:                       ;
   xor   ax,ax              ;
   int   16h                ;
   int   20h                ; выход по-любой клавише
 
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; процедура выводит на экран АХ в HEX
outHex:
   xchg  dx,ax               ; DX = AX
   mov   cx,4                ; число цифр для вывода
@@:
   shld  ax,dx,4             ; получить в AL очередную цифру
   rol   dx,4                ; удалить ее из DX
   and   al,0Fh              ; оставить в AL только эту цифру
   cmp   al,0Ah              ; три команды, переводящие
   sbb   al,69h              ;    ..шестнадцатеричную цифру в AL
   das                       ;         ..в соответствующий ASCII-код
   int   29h                 ; вывод на экран
   loop  @b                  ; повторить для всех цифр
ret

Оцени полезность:

15   голосов , оценка 3.933 из 5
Похожие ответы