Подсчет в целочисленном массиве суммы элементов - Assembler

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

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

Составить программу для подсчета в целочисленном массиве суммы элементов, предшествующих первому нулевому элементу. При отсутствии нулевых элементов выдать соответствующее сообщение и подсчитать сумму всех элементов массива.

Решение задачи: «Подсчет в целочисленном массиве суммы элементов»

textual
Листинг программы
  1. .model small
  2. .stack 100h
  3. .data
  4.     arr db 1,2,3,4,5,0,7,8,9,10,11,12,13
  5.     len dw $-arr  
  6.     res_hlp1 db "No null elements! Result: $"
  7.     res_hlp2 db "Exist null elements! Result: $"
  8. .code
  9. begin:
  10.     mov ax, @data
  11.     mov ds, ax
  12.     mov es, ax
  13.    
  14.     lea si, arr
  15.     mov cx, len
  16.     xor bl, bl  
  17.     xor dx, dx
  18. c1:
  19.     add bl, arr[si] ; bl = bl + arr[si]
  20.     cmp arr[si], 0   ; сравниваем с нулем
  21.     jne skip ; arr[si] != 0 -> skip
  22.     jmp stop ; arr[si] == 0 -> stop
  23. skip:
  24.     inc si ; si = si + 1
  25.     loop c1 ; цикл
  26.    
  27. stop:  
  28.     cmp cx, 0 ; сравниваем СХ с нулем
  29.     jne msg2 ; если не равно - значит есть нулевые элементы (т.к. цикл прерван был раньше времени)
  30.     lea dx, res_hlp1
  31.     jmp ex
  32. msg2:
  33.     lea dx, res_hlp2
  34. ex:
  35.     mov ah, 9 ; выводим сообщение
  36.     int 21h
  37.     mov al, bl ; тут выводим сумму элементов (единственный момент - корректно выводит числа от 0 до 99). Если нужно трёхзначное - напишите.
  38.     aam
  39.     or ax, 3030h
  40.     mov dl, ah
  41.     mov dh, al
  42.     mov ah, 2
  43.     int 21h
  44.     mov dl, dh
  45.     int 21h
  46.  
  47.     mov ax, 4c00h
  48.     int 21h    
  49. ends
  50.  
  51. 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

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

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

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