Скопировать элементы двухбайтового массива, у которых младший байт имеет значение в диапазоне от 5 до 10 - Assembler

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

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

Здравствуйте , в вузе задали задачку не могу сделать ,помогите пожалуйста В кодовом сегменте размещён массив из 20ти двухбайтных кодов Переписать в сегмент данных те из них у которых младший байт имеет значение в диапазоне 5-10

Решение задачи: «Скопировать элементы двухбайтового массива, у которых младший байт имеет значение в диапазоне от 5 до 10»

textual
Листинг программы
_STACK  segment para stack
        db      1024 dup(?)
_STACK  ends
 
_DATA   segment
        Array   dw      20 dup(?)
        Len     dw      ?
        CrLf    db      0Dh, 0Ah, '$'
_DATA   ends
 
_TEXT   segment
        assume  cs:_TEXT, ds:_DATA, ss:_STACK
main    proc
        ;инициализация сегментного регистра данных
        mov     ax,     _DATA
        mov     ds,     ax
 
        ;массив из 20 двухбайтных элементов
        jmp     AroundArray
CodeArray:
                dw      26510, 12652, 49050, 48324, 34304
                dw      48652, 29383, 15878, 15244, 39543
                dw       2642, 35865,  2450,  5332, 44593
                dw      47090,  8378, 56513, 14246, 51065
AroundArray:
 
        ;копирование
        lea     di,     [Array]
        mov     dx,     0
        mov     cx,     20
        lea     si,     cs:[CodeArray]
        @@For:
                mov     ax,     cs:[si]
                add     si,     2
                cmp     al,     5
                jb      @@Next
                cmp     al,     10
                ja      @@Next
 
                mov     [di],   ax
                add     di,     2
                inc     dx
        @@Next:
        loop    @@For
        mov     [Len],  dx
        ;завершение программы
        mov     ax,     4C00h
        int 21h
main    endp
 
_TEXT   ends
 
        end     main

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

  1. _STACK - сегмент стека, в котором будут храниться временные значения
  2. _DATA - сегмент данных, в котором будет размещен массив и переменная Len
  3. _TEXT - сегмент кода, в котором находится процедура main
  4. main - процедура, в которой находится код программы
  5. mov ax, _DATA - инициализация сегментного регистра данных
  6. mov ds, ax - установка сегмента данных
  7. CodeArray: - метка начала массива
  8. dw 26510, 12652, 49050, 48324, 34304 - заполнение массива двубайтными значениями
  9. dw 48652, 29383, 15878, 15244, 39543 - продолжение заполнения массива
  10. dw 2642, 35865, 2450, 5332, 44593 - продолжение заполнения массива
  11. dw 47090, 8378, 56513, 14246, 51065 - продолжение заполнения массива
  12. AroundArray: - метка начала цикла копирования
  13. lea di, [Array] - указание на начало копируемого массива
  14. mov dx, 0 - инициализация счетчика копирования
  15. mov cx, 20 - установка счетчика количества копий
  16. lea si, cs:[CodeArray] - указание на начало исходного массива
  17. @@For: - метка начала цикла по массиву
  18. mov ax, cs:[si] - получение значения из исходного массива
  19. add si, 2 - переход к следующему элементу исходного массива
  20. cmp al, 5 - проверка младшего байта на значение 5
  21. jb @@Next - переход к следующему элементу, если младший байт меньше 5
  22. cmp al, 10 - проверка младшего байта на значение 10
  23. ja @@Next - переход к следующему элементу, если младший байт больше или равен 10
  24. mov [di], ax - копирование элемента в целевой массив
  25. add di, 2 - переход к следующему элементу целевого массива
  26. inc dx - увеличение счетчика копий
  27. @@Next: - метка окончания цикла по массиву
  28. loop @@For - повторение цикла до окончания целевого массива
  29. mov [Len], dx - сохранение количества скопированных элементов
  30. mov ax, 4C00h - завершение программы
  31. int 21h - вызов функции завершения работы программы

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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