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