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

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

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

Добрый день, в задании нужно удалить элементы массива, между минимумом и максимумом, но как удалять, я без понятия, нашел только минимальный и максимальный.
.model   small
.data
.code
array db 1,2,3,4,5
mov si, offset array
mov cx, 5
xor bx, bx                     
@1: 
     lodsb 
     cmp al, bh 
     jg max
     cmp al, bl 
     jl min
     jmp @@1
min: 
     mov bl, al
     jmp @@1
max:
    mov bh, al
@@1:
    loop @1 
mov ah,4ch
int 21h    
end

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

textual
Листинг программы
LOCALS
 
.model small
 
.stack 100h
 
.data
        Array   db      3, 1, 3, 8, 15, 10   ;массив
        Len     dw      $-Array         ;длина массива
 
.code
 
main    proc
    mov ax,     @data
    mov ds, ax
 
        lea     si,     Array
        mov     cx,     Len
        mov     bx,     si      ;адрес минимального элемента
        mov     di,     si      ;адрес максимального элемента
@@MinMax:
        mov     al,     [si]
        cmp     al,     [bx]
        jbe     @@TestMax
        mov     bx,     si
@@TestMax:
        cmp     al,     [di]
        jae     @@Next
        mov     di,     si
@@Next:
        add     si,     1
        loop    @@MinMax
 
        ;определение начального индекса и конечного индекса
        cmp     bx,     di
        jbe     @@NoExchange
        xchg    bx,     di
@@NoExchange:
        ;вычисление количества удаляемых элементов
        mov     cx,     di
        sub     cx,     bx
        jcxz    @@Nothing       ;если все элементы одинаковы и минимум равен максимуму
        dec     cx
        jcxz    @@Nothing       ;если минимальный и максимальный элементы расположены рядом
 
        ;сдвиг массива
        mov     ax,     Len
        ;уточнение длины массива после удаления элементов
        sub     Len,    cx
        ;вычисление количества сдвигаемых элементов массива
        mov     si,     di
        mov     di,     bx
        add     di,     1
 
        lea     cx,     Array   ;cx - адрес начала массива
        add     cx,     ax      ;cx - адрес ячейки после массива
        sub     cx,     si      ;cx - количество сдвигаемых элементов
        ;настройка сегментного регистра es для строковой команды movs
        mov     ax,     ds
        mov     es,     ax
        ;перемещение элементов массива
        rep     movsb
@@Nothing:
    mov ax, 4C00h
    int 21h
main    endp
 
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
Похожие ответы