Удалить элементы массива между минимальным и максимальным - 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 завершается. Итерации массива и перемещение элементов с помощью инструкций сдвига основная часть процедуры.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д