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