Подсчет в целочисленном массиве суммы элементов - 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

Объяснение кода листинга программы

  1. Объявляется сегмент данных и стека с размером 100h.
  2. В секции данных определяются:
    • Переменная arr типа байт, содержащая элементы массива.
    • Переменная len типа слово, содержащая размер массива.
    • Переменная res_hlp1 типа байт, содержащая сообщение о том, что нет нулевых элементов.
    • Переменная res_hlp2 типа байт, содержащая сообщение о том, что есть нулевые элементы.
  3. В секции кода начинается выполнение программы:
    • Инициализируются регистры данных ax и ds для работы с данными.
    • Адрес массива arr загружается в регистр si.
    • Количество элементов массива len загружается в регистр cx.
    • Регистры bl и dx обнуляются.
  4. Начинается цикл c1:
    • К текущему значению bl прибавляется значение элемента массива, расположенного по адресу в si.
    • Значение элемента массива сравнивается с нулем.
    • Если элемент не равен нулю, происходит переход к следующей операции.
    • Если элемент равен нулю, происходит переход к метке stop.
  5. Метка stop:
    • Проверяется условие завершения цикла.
    • В зависимости от результата выводится соответствующее сообщение (res_hlp1 или res_hlp2).
  6. Происходит вывод результата (суммы элементов) в виде числа.
  7. Программа завершается вызовом программы завершения.

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

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