Другие языки программирования и технологии

Как а в ассемблере найти минимальный элемент массива?

В общем и целом, точно так же, как и в языках высокого уровня.
Элементы по очереди сравниваются со значением текущего минимума. Если текущий элемент меньше минимума, то он становится новым минимумом. И так продолжается, пока весь массив не будет проверен.
За начальное значение минимума можно принять заведомо большое значение или взять первый элемент массива.

Конкретная реализация зависит от процессора/контроллера. Знаковые или беззнаковые элементы массива. От размера элементов (byte, word, dword), а также целые они или с плавающей запятой.
Вот пример поиска минимума для процессора i8086, массив знаковых чисел размером 1 байт:

.model small
.data
array db 15,-100,50,0; и т. д. элементы массива
len equ $ - array; кол-во элементов
min db ?; значение минимального элемента
imin dw ?; индекс минимального элемента
.stack 100h
.code
start:
mov ax,@data
mov ds,ax
mov cx,len
dec cx
xor di,di; указатель на 1-й элемент, принятый за начальный минимум
mov si,1; указатель на 2 элемент (его индекс 1)
cycle:
mov al,array[si]
cmp al,array[di]
jge next
mov di,si
next:
inc si
loop cycle
mov imin,di; запись индекса минимального элемента
mov al,array[di]
mov min,al; запись значения минимального элемента
; ...
mov ah,4ch
int 21h
end start

Программа находит минимум в массиве и сохраняет его в переменной min. Также в переменной imin сохраняется индекс минимального элемента.
Если элементы массива беззнаковые числа, то команду jge нужно заменить на jae (или jc, что то же самое) .
Если размеры элементов больше байта, то нужно db поменять на dw или dd и учитывать это при индексации, вычислении кол-ва элементов массива, а так же в командах сравнения использовать соответствующий аккумулятор.
Кол-во элементов может быть не постоянным, например вводиться с клавиатуры, тогда следует завести переменную, для его хранения.
Если элементы представляют из себя числа с плавающей запятой, то придётся использовать сопроцессор.
Можно использовать команды строковых операций lods(b | w | d), но нужно учитывать, что инкремент индекса в этом случае происходит автоматически сразу после считывания элемента в аккумулятор.

Если процессор, например, i8080, i8085 или Z80, то для знаковых чисел придётся дополнительно вручную анализировать знаковые разряды.
Как видите, всё довольно просто, но нужна очень детальная конкретизация задачи.
Фёдор Пашковский
Фёдор Пашковский
51 590
Лучший ответ
xor al,al
mov cx,100
start:
cmp al,[dx]
jnc big
mov al,[dx]
big:
inc dx
dec cx
jnz start

/// примерно так!
En Volodya
En Volodya
55 410
Соответствующими командами: либо с помощью соответствующей команды выбора минимума в цикле, либо с помощью условного перехода в зависимости от возможностей ассемблера
Ильдар Хакимов
Ильдар Хакимов
76 473

Похожие вопросы