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

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

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

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

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

textual
Листинг программы
  1. org 100h
  2. jmp start
  3.  
  4. mess0  db   13,10,'Positive summ: $'   ; текст мессаги
  5.  
  6. mass   db   100, 018, -66, 043, 078    ; матрица 5х5
  7.        db   051, -10, 123, -77, 005
  8.        db   060, 001, -94, -19, 038
  9.        db   099, 086, 022, 010, -49
  10.        db   055, -66, 050, 119, 121
  11.  
  12. start:
  13.    mov   cx,5               ; CX = счётчик цикла (5 столбцов в матрице)
  14.    mov   si,mass            ; SI = адрес начала массива (для lodsb)
  15.    push  0  0  0            ; в АХ будем читать, в ВХ будет сумма, DX = сл.строка
  16.    pop   ax bx dx           ;   ..пока очищаем их (AX/BX/DX = нуль)
  17.    dec   dx                 ; цикл будет увеличивать DX,
  18. next:                       ;   ..поэтому ставим -1, чтоб начать с нуля.
  19.    push  cx                 ; запомним счётчик..
  20.    inc   dx                 ; DX + 1
  21.    add   si,dx              ; SI = адрес матрицы + смещение сл.элемента
  22. adding:                     ; внутренний цикл (суммирование)
  23.    lodsb                    ; читаем в AL байт из SI
  24.    or    al,al              ; проверка AL (эта операция взводит флаги)
  25.    js    negate             ; переход, если флаг SF=1 (число отрицательное)
  26.    add   bx,ax              ; иначе: сумма положительных в ВХ
  27. negate:                     ;
  28.    loop  adding             ; мотает цикл, пока СХ > 0
  29.    pop   cx                 ; восстанавливаем счётчик
  30.    dec   cx                 ; уменьшаем его для сл.строки
  31.    jnz   next               ; мотаем внешний цикл, пока CX > 0
  32.                             ;
  33.    mov   ah,9               ; мессага
  34.    mov   dx,mess0           ;
  35.    int   21h                ;
  36.    xchg  ax,bx              ; отправляем полученную сумму в AX
  37.    call  outHex             ; зовём функцию "вывода числа на экран"
  38.    mov   al,'h'             ; вставляем после числа литтер "HEX"
  39.    int   29h                ;
  40.  
  41. exit:                       ;
  42.    xor   ax,ax              ;
  43.    int   16h                ;
  44.    int   20h                ; выход по-любой клавише
  45.  
  46. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  47. ; процедура выводит на экран АХ в HEX
  48. outHex:
  49.    xchg  dx,ax               ; DX = AX
  50.    mov   cx,4                ; число цифр для вывода
  51. @@:
  52.    shld  ax,dx,4             ; получить в AL очередную цифру
  53.    rol   dx,4                ; удалить ее из DX
  54.    and   al,0Fh              ; оставить в AL только эту цифру
  55.    cmp   al,0Ah              ; три команды, переводящие
  56.    sbb   al,69h              ;    ..шестнадцатеричную цифру в AL
  57.    das                       ;         ..в соответствующий ASCII-код
  58.    int   29h                 ; вывод на экран
  59.    loop  @b                  ; повторить для всех цифр
  60. ret

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

15   голосов , оценка 3.933 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы