Удалить элементы массива между минимальным и максимальным - Assembler

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

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

Добрый день, в задании нужно удалить элементы массива, между минимумом и максимумом, но как удалять, я без понятия, нашел только минимальный и максимальный.
Листинг программы
  1. .model small
  2. .data
  3. .code
  4. array db 1,2,3,4,5
  5. mov si, offset array
  6. mov cx, 5
  7. xor bx, bx
  8. @1:
  9. lodsb
  10. cmp al, bh
  11. jg max
  12. cmp al, bl
  13. jl min
  14. jmp @@1
  15. min:
  16. mov bl, al
  17. jmp @@1
  18. max:
  19. mov bh, al
  20. @@1:
  21. loop @1
  22. mov ah,4ch
  23. int 21h
  24. end

Решение задачи: «Удалить элементы массива между минимальным и максимальным»

textual
Листинг программы
  1. LOCALS
  2.  
  3. .model small
  4.  
  5. .stack 100h
  6.  
  7. .data
  8.         Array   db      3, 1, 3, 8, 15, 10   ;массив
  9.         Len     dw      $-Array         ;длина массива
  10.  
  11. .code
  12.  
  13. main    proc
  14.     mov ax,     @data
  15.     mov ds, ax
  16.  
  17.         lea     si,     Array
  18.         mov     cx,     Len
  19.         mov     bx,     si      ;адрес минимального элемента
  20.         mov     di,     si      ;адрес максимального элемента
  21. @@MinMax:
  22.         mov     al,     [si]
  23.         cmp     al,     [bx]
  24.         jbe     @@TestMax
  25.         mov     bx,     si
  26. @@TestMax:
  27.         cmp     al,     [di]
  28.         jae     @@Next
  29.         mov     di,     si
  30. @@Next:
  31.         add     si,     1
  32.         loop    @@MinMax
  33.  
  34.         ;определение начального индекса и конечного индекса
  35.         cmp     bx,     di
  36.         jbe     @@NoExchange
  37.         xchg    bx,     di
  38. @@NoExchange:
  39.         ;вычисление количества удаляемых элементов
  40.         mov     cx,     di
  41.         sub     cx,     bx
  42.         jcxz    @@Nothing       ;если все элементы одинаковы и минимум равен максимуму
  43.         dec     cx
  44.         jcxz    @@Nothing       ;если минимальный и максимальный элементы расположены рядом
  45.  
  46.         ;сдвиг массива
  47.         mov     ax,     Len
  48.         ;уточнение длины массива после удаления элементов
  49.         sub     Len,    cx
  50.         ;вычисление количества сдвигаемых элементов массива
  51.         mov     si,     di
  52.         mov     di,     bx
  53.         add     di,     1
  54.  
  55.         lea     cx,     Array   ;cx - адрес начала массива
  56.         add     cx,     ax      ;cx - адрес ячейки после массива
  57.         sub     cx,     si      ;cx - количество сдвигаемых элементов
  58.         ;настройка сегментного регистра es для строковой команды movs
  59.         mov     ax,     ds
  60.         mov     es,     ax
  61.         ;перемещение элементов массива
  62.         rep     movsb
  63. @@Nothing:
  64.     mov ax, 4C00h
  65.     int 21h
  66. main    endp
  67.  
  68. end main

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

  1. Создание переменных:
    • Array - массив с данными [3, 1, 3, 8, 15, 10]
    • Len - длина массива, вычисленная автоматически
  2. Инициализация сегментов и регистров:
    • Устанавливается размер стека как 100h и модель программы - small.
    • Загружаются адреса сегментов данных и кода в соответствующие регистры.
  3. Выполнение основной части программы:
    • Процедура main начинается.
    • Процедура циклически ищет минимальное и максимальное значения в массиве.
    • Находятся адреса минимального и максимального элементов в массиве.
    • После этого проверяется их порядок и, при необходимости, меняются местами.
    • Рассчитывается количество элементов между найденными минимальным и максимальным значениями.
    • Из массива удаляются элементы путем их сдвига.
    • Размер массива обновляется в зависимости от удаленных элементов.
    • Программа завершается системным вызовом Interruption 21h с кодом возврата 4С00h.
  4. Окончание процедуры:
    • Процедура main завершается. Итерации массива и перемещение элементов с помощью инструкций сдвига основная часть процедуры.

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


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

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

14   голосов , оценка 3.857 из 5

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

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

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