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