Описать процедуру, которая вычисляет число четных элементов в массиве - 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

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

  1. Программа начинается с объявления переменных и массивов.
  2. В сегменте данных (DS) размещаются два массива: A и B, каждый из которых содержит набор чисел.
  3. Переменная szA вычисляет размер массива A, а szB — размер массива B.
  4. В функции main происходит следующее: — Переменная aX получает значение сегмента данных. — Переменная DS устанавливается равной aX, что приведет к тому, что сегмент данных будет использоваться при обращении к переменным. — Два вызова функции check происходят, каждый из которых проверяет четность элементов в одном из массивов. — Переменная dx получает значение 4C00h, что является командой завершения работы программы. — Команда int 21h вызывает обработчик прерывания 21h, который передает управление операционной системе.
  5. Функция check проверяет четность элементов массива. — Переменная ax устанавливается равной cx (количество элементов в массиве). — Цикл loop проходит по всем элементам массива. — Каждый четный элемент уменьшается на 1 с помощью операции shr dx,1. — Если результат делителя равен 0, то это означает, что текущий элемент массива — нечетное число. — Переменная bx увеличивается на 2 после каждой итерации цикла, чтобы перейти к следующему элементу массива. — Цикл продолжается до тех пор, пока не будут проверены все элементы массива. — Функция возвращает управление в основную программу.

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

6   голосов , оценка 3.667 из 5
Похожие ответы