Копирование чётных чисел из заданного массива - Assembler
Формулировка задачи:
Уважаемые знатоки. Помогите создать программу, либо же укажите ссылочкой на существующие аналоги, которая из заданного массива перепишет в новый массив парные элементы. Буду рад любой информации, заранее благодарен.
Решение задачи: «Копирование чётных чисел из заданного массива»
textual
Листинг программы
.model small .stack 100h .data arr db 1,2,3,4,5,6,7,8,9,2,8,5,3,4,6,7,8,1,3,2,0,2,8,6,5,4 len dw 26 res db 255 dup (?) arr_lbl db 'Array = $' res_lbl db 'Result = $' endl db 13,10,'$' .code begin: mov ax, @data mov ds, ax mov es, ax lea dx, arr_lbl mov ah, 9 int 21h mov cx, len xor si, si mov ah, 2 sa: mov dl, arr[si] add dl ,'0' int 21h inc si loop sa lea dx, endl mov ah, 9 int 21h xor si, si xor di, di mov cx, len for: mov al, arr[si] inc si test al, 1 jnz lp mov res[di],al inc di lp: loop for lea dx, res_lbl mov ah, 9 int 21h nxt: mov cx, di xor si, si mov ah, 2 prt: mov dl, res[si] add dl, '0' int 21h inc si loop prt mov ax, 4c00h int 21h ends end begin
Объяснение кода листинга программы
- Создание массива:
- название переменной:
arr - значения: [1,2,3,4,5,6,7,8,9,2,8,5,3,4,6,7,8,1,3,2,0,2,8,6,5,4]
- название переменной:
- Определение длины массива:
- название переменной:
len - значение: 26
- название переменной:
- Создание массива для результатов:
- название переменной:
res - значение: 255 заполненных значением
неопределённо(dup - дубликат)
- название переменной:
- Строковая переменная для вывода метки
Array = $:- название переменной:
arr_lbl - значение: 'Array = $'
- название переменной:
- Строковая переменная для вывода метки
Result = $:- название переменной:
res_lbl - значение: 'Result = $'
- название переменной:
- Переменная для перевода строки:
- название переменной:
endl - значение: 13,10,'$'
- название переменной:
- Начало кода:
- метка:
begin
- метка:
- Переменные инициализации сегментов:
- инициализация сегмента данных:
mov ax, @data - загрузка адреса сегмента данных в регистр:
mov ds, ax - загрузка адреса сегмента данных в регистр для сегмента назначения (результатов):
mov es, ax
- инициализация сегмента данных:
- Вывод метки
Array = $:- загрузка адреса строки
arr_lblв регистр dx:lea dx, arr_lbl - вызов прерывания для печати строки:
mov ah, 9,int 21h
- загрузка адреса строки
- Вывод массива
arr:- инициализация счётчика cx значением длины массива:
mov cx, len - инициализация индекса массива si значением 0:
xor si, si - вывод каждого элемента массива на экран (в цикле):
mov dl, arr[si]add dl, '0'(преобразует значение в символ)int 21h(печать)
- инициализация счётчика cx значением длины массива:
- Перевод строки:
- загрузка адреса строки
endlв регистр dx:lea dx, endl - вызов прерывания для печати строки:
mov ah, 9,int 21h
- загрузка адреса строки
- Копирование чётных чисел из массива
arrв массивres:- инициализация индекса массива si значением 0:
xor si, si - инициализация индекса массива di значениями 0:
xor di, di - инициализация счётчика cx значением длины массива:
mov cx, len - в цикле проверяется каждый элемент
arr:- счетчик si указывает на текущий элемент
- элемент проверяется на четность с помощью
test al, 1 - если элемент четный, он копируется в
resи инкрементируется счетчикdi
- инициализация индекса массива si значением 0:
- Вывод метки
Result = $:- загрузка адреса строки
res_lblв регистр dx:lea dx, res_lbl - вызов прерывания для печати строки:
mov ah, 9,int 21h
- загрузка адреса строки
- Печать результатов из массива
res:- загрузка значения из
diв счетчик cx:mov cx, di - сброс счётчика si:
xor si, si - вывод каждого элемента массива
resна экран (в цикле):- загрузка значения из
res[si]в регистрdl add dl, '0'(преобразует значение в символ)int 21h(печать)
- загрузка значения из
- загрузка значения из
- Завершение программы:
- загрузка значения 4c00h в регистр
ax(завершение программы с кодом возврата 0):mov ax, 4c00h - вызов прерывания для завершения программы:
int 21h
- загрузка значения 4c00h в регистр
- Конец кода:
- метка
ends
- метка
- Завершение начала кода:
- конец программы:
end begin
- конец программы: