Найти сумму положительных элементов массива - Assembler (224633)

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

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

дан массив из десяти элементов a db 1,2,3,4,5,-6,-20,-85,1,-10 n equ 10 найти сумму положительных элементов
вот люди сделал кому надо берите
.model small
.stack 100h
.data
     a db 1,2,3,4,5,6,-85,10,-9,11
     n equ 10
     p db '    ','$'
.code
     ;Начальные присвоения
     ;*********
     mov ax,@data
     mov ds,ax
     mov ax,0
     mov si,0
     mov cx,n
     ;*********
     ;Решение
     ;*********
label1:
      cmp a[si],0
      jnl label2
      inc si
      cmp si,n
      je c20
      loop label1
label2:
       add al,a[si]
       inc si
       cmp si,n
       je c21
       loop label1 
;*********
;Вывод данных(работает как с 8 так и 16 и 32 битными операциями)
;*********
c21:
     mov cx,10
     lea si,p+3
c20: 
     cmp ax,10
     jb c30
     xor dx,dx
     div cx
     or dl,30h
     mov [si],dl
     dec si
     jmp c20
c30:
     or al,30h
     mov [si],al
     lea dx,p
     mov ah,9
     int 21h
;The end =)
;*********

Решение задачи: «Найти сумму положительных элементов массива»

textual
Листинг программы
.model small
.stack 100h
.data
     a db 1,2,3,4,5,6,-85,10,-9,11
     n equ 10
     p db '    ','$'
.code
     ;Начальные присвоения
     ;*********
     mov ax,@data
     mov ds,ax
     mov ax,0
     mov si,0
     mov cx,n
     ;*********
     ;Решение
     ;*********
label1:
      cmp a[si],0
      jnl label2
      inc si
      cmp si,n
      je c20
      loop label1
label2:
       add al,a[si]
       inc si
       cmp si,n
       je c21
       loop label1 
;*********
;Вывод данных(работает как с 8 так и 16 и 32 битными операциями)
;*********
c21:
     mov cx,10
     lea si,p+3
c20: 
     cmp ax,10
     jb c30
     xor dx,dx
     div cx
     or dl,30h
     mov [si],dl
     dec si
     jmp c20
c30:
     or al,30h
     mov [si],al
     lea dx,p
     mov ah,9
     int 21h
;The end =)
;*********

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

  1. Объявление переменных:
    • a - массив из 10 элементов (1, 2, 3, 4, 5, 6, -85, 10, -9, 11)
    • n - количество элементов в массиве (10)
    • p - строка из 2 символов ('   ', '$')
  2. Начальные присвоения:
    • ax - используется как временная переменная
    • ds - сегмент данных
    • ax - инициализируется нулем
    • si - индекс элемента массива
    • cx - используется для цикла
  3. Основной цикл:
    • label1 - метка начала цикла
    • cmp a[si], 0 - проверка на ноль
    • jnl label2 - переход к label2, если элемент не равен нулю
    • inc si - увеличение индекса элемента
    • cmp si, n - проверка, достигнут ли конец массива
    • je c20 - переход к c20, если индекс выходит за пределы массива
    • loop label1 - повтор цикла
  4. Вспомогательный цикл:
    • label2 - метка начала вспомогательного цикла
    • add al, a[si] - прибавление значения элемента к ax
    • inc si - увеличение индекса элемента
    • cmp si, n - проверка, достигнут ли конец массива
    • je c21 - переход к c21, если индекс выходит за пределы массива
    • loop label1 - повтор вспомогательного цикла
  5. Вывод данных:
    • c21 - метка начала вывода данных
    • mov cx, 10 - инициализация счетчика циклом
    • lea si, p+3 - инициализация индекса для вывода строки
    • c20 - метка для проверки, достигнут ли конец вывода данных
    • jmp c20 - переход к c20, если данные еще не полностью выведены
    • c30 - метка для вывода символа в конце строки
    • or al, 30h - получение символа в верхнем регистре
    • mov [si], al - запись символа в строку
    • dec si - уменьшение индекса для следующего символа
    • jmp c20 - переход к c20, если данные еще не полностью выведены
    • int 21h - вызов функции вывода символа на экран
  6. Конец программы

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


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

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

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