Сумма положительных элементов над главной диагональю матрицы - 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д