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

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

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

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

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

textual
Листинг программы
.model small
.stack 100h
 
.data
        A       db      100
        B       db      150
        Array   db      1, 2, 40, 122, 133, 245, 144, 111, 55
        Len     equ     $-Array
 
        S       db      ?
        N       db      ?
        MsgOverflow     db      'Overflow', 0Dh, 0Ah, '$'
        MsgNothing      db      'Find Nothing', 0Dh, 0Ah, '$'
.code
main:
        mov     ax,     @data
        mov     ds,     ax
 
        lea     si,     Array
        mov     cx,     Len
        mov     S,      0       ;сумма
        mov     N,      0       ;количество
        cld                     ;направление - приращение адреса
@@For:
        lodsb
        cmp     al,     0
        js      @@Next
        cmp     al,     A
        jl      @@Next
        cmp     al,     B
        jg      @@Next
 
        inc     N               ;N=N+1
        add     S,      al      ;S=S+Array[i]
        jnc     @@Next
        jns     @@Next
        mov     ah,     09h
        lea     dx,     MsgOverflow
        int     21h
@@Next:
        loop    @@For
 
        cmp     N,      0
        jne     @@Divide
        mov     ah,     09h
        lea     dx,     MsgNothing
        int     21h
        jmp     @@Exit
 
        ;вычисление частного и остатка
@@Divide:
        mov     al,     S
        cbw
        idiv    N
 
        mov     dl,     al      ;частное поместить в dl
        lea     si,     Array
        add     si,     Len
        dec     si
        mov     [si],   ah      ;остаток - в последний байт исходного массива
 
        ;В коде остатка выяснить наличие "0" в битах 7, 5, 3 одновременно.
        test    ah,     10101000b
        jnz     @@Skip
        ;При их наличии код частного сдвинуть арифметически вправо на один разряд.
        shr     ah,     1
@@Skip:
 
@@Exit:
        mov  ax, 4C00h                   ; выход в DOS
        int  21h
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
Похожие ответы