Копирование чётных чисел из заданного массива - 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

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

  1. Создание массива:
    • название переменной: 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]
  2. Определение длины массива:
    • название переменной: len
    • значение: 26
  3. Создание массива для результатов:
    • название переменной: res
    • значение: 255 заполненных значением неопределённо (dup - дубликат)
  4. Строковая переменная для вывода метки Array = $:
    • название переменной: arr_lbl
    • значение: 'Array = $'
  5. Строковая переменная для вывода метки Result = $:
    • название переменной: res_lbl
    • значение: 'Result = $'
  6. Переменная для перевода строки:
    • название переменной: endl
    • значение: 13,10,'$'
  7. Начало кода:
    • метка: begin
  8. Переменные инициализации сегментов:
    • инициализация сегмента данных: mov ax, @data
    • загрузка адреса сегмента данных в регистр: mov ds, ax
    • загрузка адреса сегмента данных в регистр для сегмента назначения (результатов): mov es, ax
  9. Вывод метки Array = $:
    • загрузка адреса строки arr_lbl в регистр dx: lea dx, arr_lbl
    • вызов прерывания для печати строки: mov ah, 9, int 21h
  10. Вывод массива arr:
    • инициализация счётчика cx значением длины массива: mov cx, len
    • инициализация индекса массива si значением 0: xor si, si
    • вывод каждого элемента массива на экран (в цикле):
      • mov dl, arr[si]
      • add dl, '0' (преобразует значение в символ)
      • int 21h (печать)
  11. Перевод строки:
    • загрузка адреса строки endl в регистр dx: lea dx, endl
    • вызов прерывания для печати строки: mov ah, 9, int 21h
  12. Копирование чётных чисел из массива arr в массив res:
    • инициализация индекса массива si значением 0: xor si, si
    • инициализация индекса массива di значениями 0: xor di, di
    • инициализация счётчика cx значением длины массива: mov cx, len
    • в цикле проверяется каждый элемент arr:
      • счетчик si указывает на текущий элемент
      • элемент проверяется на четность с помощью test al, 1
      • если элемент четный, он копируется в res и инкрементируется счетчик di
  13. Вывод метки Result = $:
    • загрузка адреса строки res_lbl в регистр dx: lea dx, res_lbl
    • вызов прерывания для печати строки: mov ah, 9, int 21h
  14. Печать результатов из массива res:
    • загрузка значения из di в счетчик cx: mov cx, di
    • сброс счётчика si: xor si, si
    • вывод каждого элемента массива res на экран (в цикле):
      • загрузка значения из res[si] в регистр dl
      • add dl, '0' (преобразует значение в символ)
      • int 21h (печать)
  15. Завершение программы:
    • загрузка значения 4c00h в регистр ax (завершение программы с кодом возврата 0): mov ax, 4c00h
    • вызов прерывания для завершения программы: int 21h
  16. Конец кода:
    • метка ends
  17. Завершение начала кода:
    • конец программы: end begin

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

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