Найти сумму и количество положительных байтов массива - Assembler

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

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

Есть задание: Найти сумму S и количество N положительных байтов массива, заключенных между А и В. Предусмотреть сообщение о возникшем переполнении. Определить S/N. Частное поместить в регистр DL, а остаток - в последний байт исходного массива. В коде остатка выяснить наличие "0" в битах 7, 5, 3 одновременно. При их наличии код частного сдвинуть арифметически вправо на один разряд. Прошу помощи с написанием кода и/или поделитесь ссылками на ресурсы, где можно взять информацию, примеры, для решения данной задачи!

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

textual
Листинг программы
  1. .model small
  2. .stack 100h
  3.  
  4. .data
  5.         A       db      100
  6.         B       db      150
  7.         Array   db      1, 2, 40, 122, 133, 245, 144, 111, 55
  8.         Len     equ     $-Array
  9.  
  10.         S       db      ?
  11.         N       db      ?
  12.         MsgOverflow     db      'Overflow', 0Dh, 0Ah, '$'
  13.         MsgNothing      db      'Find Nothing', 0Dh, 0Ah, '$'
  14. .code
  15. main:
  16.         mov     ax,     @data
  17.         mov     ds,     ax
  18.  
  19.         lea     si,     Array
  20.         mov     cx,     Len
  21.         mov     S,      0       ;сумма
  22.         mov     N,      0       ;количество
  23.         cld                     ;направление - приращение адреса
  24. @@For:
  25.         lodsb
  26.         cmp     al,     0
  27.         js      @@Next
  28.         cmp     al,     A
  29.         jl      @@Next
  30.         cmp     al,     B
  31.         jg      @@Next
  32.  
  33.         inc     N               ;N=N+1
  34.         add     S,      al      ;S=S+Array[i]
  35.         jnc     @@Next
  36.         jns     @@Next
  37.         mov     ah,     09h
  38.         lea     dx,     MsgOverflow
  39.         int     21h
  40. @@Next:
  41.         loop    @@For
  42.  
  43.         cmp     N,      0
  44.         jne     @@Divide
  45.         mov     ah,     09h
  46.         lea     dx,     MsgNothing
  47.         int     21h
  48.         jmp     @@Exit
  49.  
  50.         ;вычисление частного и остатка
  51. @@Divide:
  52.         mov     al,     S
  53.         cbw
  54.         idiv    N
  55.  
  56.         mov     dl,     al      ;частное поместить в dl
  57.         lea     si,     Array
  58.         add     si,     Len
  59.         dec     si
  60.         mov     [si],   ah      ;остаток - в последний байт исходного массива
  61.  
  62.         коде остатка выяснить наличие "0" в битах 7, 5, 3 одновременно.
  63.         test    ah,     10101000b
  64.         jnz     @@Skip
  65.         ;При их наличии код частного сдвинуть арифметически вправо на один разряд.
  66.         shr     ah,     1
  67. @@Skip:
  68.  
  69. @@Exit:
  70.         mov  ax, 4C00h                   ; выход в DOS
  71.         int  21h
  72. end     main

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

  1. Создание переменных:
    • A - байт со значением 100;
    • B - байт со значением 150;
    • Array - массив байтов с элементами 1, 2, 40, 122, 133, 245, 144, 111, 55;
    • Len - константа, равная длине массива Array;
    • S - байт для хранения суммы;
    • N - байт для хранения количества положительных чисел;
    • MsgOverflow - строка сообщения об переполнении;
    • MsgNothing - строка сообщения о том, что ничего не найдено.
  2. Установка начальных значений:
    • S устанавливается в 0;
    • N устанавливается в 0;
    • Устанавливается направление - приращение адреса.
  3. Итерация по массиву:
    • Используется инструкция lodsb для загрузки каждого байта массива в AL;
    • Проверяется, является ли байт отрицательным;
    • Проверяется, является ли байт больше значения A и меньше значения B;
    • Если условия выполняются, увеличивается количество положительных чисел и добавляется значение байта к сумме;
    • В случае переполнения выводится сообщение об этом;
    • Происходит переход к следующему элементу массива через инструкцию loop.
  4. Проверка количества положительных чисел:
    • Если количество не равно 0, происходит вычисление среднего значения и остатка от деления.
  5. Вычисление остатка:
    • Вычисляется частное и остаток от деления;
    • Остаток помещается в последний элемент массива;
    • Проверяется наличие определенных битов в остатке и сдвигается частное, если они присутствуют;
  6. Завершение программы:
    • Происходит выход в DOS. Общая задача кода - найти сумму и количество положительных байтов в массиве, а также вывести сообщение о переполнении или о том, что положительных чисел не найдено.

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


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

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

9   голосов , оценка 3.889 из 5

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

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

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