Найти сумму и количество положительных байтов массива - 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. Общая задача кода - найти сумму и количество положительных байтов в массиве, а также вывести сообщение о переполнении или о том, что положительных чисел не найдено.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д