Подсчет в целочисленном массиве суммы элементов - Assembler
Формулировка задачи:
Составить программу для подсчета в целочисленном массиве суммы элементов,
предшествующих первому нулевому элементу. При отсутствии нулевых элементов выдать
соответствующее сообщение и подсчитать сумму всех элементов массива.
Решение задачи: «Подсчет в целочисленном массиве суммы элементов»
textual
Листинг программы
- .model small
- .stack 100h
- .data
- arr db 1,2,3,4,5,0,7,8,9,10,11,12,13
- len dw $-arr
- res_hlp1 db "No null elements! Result: $"
- res_hlp2 db "Exist null elements! Result: $"
- .code
- begin:
- mov ax, @data
- mov ds, ax
- mov es, ax
- lea si, arr
- mov cx, len
- xor bl, bl
- xor dx, dx
- c1:
- add bl, arr[si] ; bl = bl + arr[si]
- cmp arr[si], 0 ; сравниваем с нулем
- jne skip ; arr[si] != 0 -> skip
- jmp stop ; arr[si] == 0 -> stop
- skip:
- inc si ; si = si + 1
- loop c1 ; цикл
- stop:
- cmp cx, 0 ; сравниваем СХ с нулем
- jne msg2 ; если не равно - значит есть нулевые элементы (т.к. цикл прерван был раньше времени)
- lea dx, res_hlp1
- jmp ex
- msg2:
- lea dx, res_hlp2
- ex:
- mov ah, 9 ; выводим сообщение
- int 21h
- mov al, bl ; тут выводим сумму элементов (единственный момент - корректно выводит числа от 0 до 99). Если нужно трёхзначное - напишите.
- aam
- or ax, 3030h
- mov dl, ah
- mov dh, al
- mov ah, 2
- int 21h
- mov dl, dh
- int 21h
- mov ax, 4c00h
- int 21h
- ends
- end begin
Объяснение кода листинга программы
- Объявляется сегмент данных и стека с размером 100h.
- В секции данных определяются:
- Переменная
arr
типа байт, содержащая элементы массива. - Переменная
len
типа слово, содержащая размер массива. - Переменная
res_hlp1
типа байт, содержащая сообщение о том, что нет нулевых элементов. - Переменная
res_hlp2
типа байт, содержащая сообщение о том, что есть нулевые элементы.
- Переменная
- В секции кода начинается выполнение программы:
- Инициализируются регистры данных
ax
иds
для работы с данными. - Адрес массива
arr
загружается в регистрsi
. - Количество элементов массива
len
загружается в регистрcx
. - Регистры
bl
иdx
обнуляются.
- Инициализируются регистры данных
- Начинается цикл
c1
:- К текущему значению
bl
прибавляется значение элемента массива, расположенного по адресу вsi
. - Значение элемента массива сравнивается с нулем.
- Если элемент не равен нулю, происходит переход к следующей операции.
- Если элемент равен нулю, происходит переход к метке
stop
.
- К текущему значению
- Метка
stop
:- Проверяется условие завершения цикла.
- В зависимости от результата выводится соответствующее сообщение (
res_hlp1
илиres_hlp2
).
- Происходит вывод результата (суммы элементов) в виде числа.
- Программа завершается вызовом программы завершения.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д