Описать процедуру, которая вычисляет число четных элементов в массиве - Assembler
Формулировка задачи:
Здравствуйте, недавно начал проходить Assembler, а точнее пару дней назад.
Написать и отладить программу на языке ассемблера. В программе описать процедуру, которая вычисляет число четных элементов в массиве. Параметры передавать следующим образом:
в ВХ – смещение массива;
в СХ – число элементов в массиве;
в АХ – результат вычислений (число четных элементов).
В основной программе вызвать описанную процедуру для двух разных массивов.
Вот такое задание, я выполнил, но не знаю как в основной программе вызвать процедуру для двух разных массивов, я знаю что такая же тема с этой же лабой уже есть, но я хочу сам разобраться, тот код понять не могу.
Вот мой код
TITLE Program3 .MODEL small .STACK 100h .DATA A DW 6, 4, 9, 4, 6 ;сам массив Max DW 0 .CODE main PROC mov DX, @data mov DS, DX mov SI, OFFSET A ;заношу в регистр Si 1й элемент массива mov CX, 5 ;количество итераций, а точнее количество элементов массива cld mov BX, [SI] ;проверяю на четность 1й элемент массива test BX, 1 jnz L1 jz l4 l4: inc dx L1: inc SI inc SI mov BX,[SI] ;проверяю остальные элементы массива на четность test BX, 1 jnz L2 inc ax L2: loop L1 mov dx,4C00h ;выход из программы int 21h main ENDP END main
Решение задачи: «Описать процедуру, которая вычисляет число четных элементов в массиве»
textual
Листинг программы
TITLE Program3 .MODEL small .STACK 100h .DATA A DW 6,4,9,4,6;сам массив szA equ ($-a)/2 B dw 1,2,3,4,5,6,7,8,9 szB equ ($-b)/2 .CODE main PROC mov aX, @data mov DS, aX lea bx,a mov cx,szA call check lea bx,b mov cx,szb call check mov dx,4C00h int 21h main ENDP check proc mov ax,cx @@01: mov dx,[bx] shr dx,1 sbb ax,0 add bx,2 loop @@01 ret check endp END main
Объяснение кода листинга программы
- Программа начинается с объявления переменных и массивов.
- В сегменте данных (DS) размещаются два массива: A и B, каждый из которых содержит набор чисел.
- Переменная
szA
вычисляет размер массива A, аszB
— размер массива B. - В функции main происходит следующее:
— Переменная
aX
получает значение сегмента данных. — ПеременнаяDS
устанавливается равнойaX
, что приведет к тому, что сегмент данных будет использоваться при обращении к переменным. — Два вызова функцииcheck
происходят, каждый из которых проверяет четность элементов в одном из массивов. — Переменнаяdx
получает значение 4C00h, что является командой завершения работы программы. — Командаint 21h
вызывает обработчик прерывания 21h, который передает управление операционной системе. - Функция
check
проверяет четность элементов массива. — Переменнаяax
устанавливается равнойcx
(количество элементов в массиве). — Циклloop
проходит по всем элементам массива. — Каждый четный элемент уменьшается на 1 с помощью операцииshr dx,1
. — Если результат делителя равен 0, то это означает, что текущий элемент массива — нечетное число. — Переменнаяbx
увеличивается на 2 после каждой итерации цикла, чтобы перейти к следующему элементу массива. — Цикл продолжается до тех пор, пока не будут проверены все элементы массива. — Функция возвращает управление в основную программу.