Копирование чётных чисел из заданного массива - Assembler

Узнай цену своей работы

Формулировка задачи:

Уважаемые знатоки. Помогите создать программу, либо же укажите ссылочкой на существующие аналоги, которая из заданного массива перепишет в новый массив парные элементы. Буду рад любой информации, заранее благодарен.

Решение задачи: «Копирование чётных чисел из заданного массива»

textual
Листинг программы
  1. .model small
  2. .stack 100h
  3. .data
  4.     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
  5.     len dw 26
  6.     res db 255 dup (?)  
  7.     arr_lbl db 'Array = $'
  8.     res_lbl db 'Result = $'
  9.     endl db 13,10,'$'
  10. .code
  11. begin:
  12.     mov ax, @data
  13.     mov ds, ax
  14.     mov es, ax
  15.     lea dx, arr_lbl
  16.     mov ah, 9
  17.     int 21h
  18.     mov cx, len
  19.     xor si, si
  20.     mov ah, 2
  21. sa: mov dl, arr[si]    
  22.     add dl ,'0'
  23.     int 21h  
  24.     inc si
  25.     loop sa
  26.     lea dx, endl
  27.     mov ah, 9
  28.     int 21h
  29.    
  30.     xor si, si  
  31.     xor di, di
  32.     mov cx, len
  33. for:
  34.     mov al, arr[si]
  35.     inc si
  36.     test al, 1
  37.     jnz lp
  38.     mov res[di],al  
  39.     inc di
  40. lp: loop for
  41.     lea dx, res_lbl
  42.     mov ah, 9
  43.     int 21h
  44. nxt:  
  45.     mov cx, di
  46.     xor si, si
  47.     mov ah, 2
  48. prt:        
  49.     mov dl, res[si]
  50.     add dl, '0'
  51.     int 21h    
  52.     inc si
  53.     loop prt    
  54.    
  55.     mov ax, 4c00h
  56.     int 21h    
  57. ends
  58.  
  59. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы