Найти сколько раз в массиве встречается минимальный элемент - Assembler
Формулировка задачи:
Dseg segment para public ‘data’ mas db -1,3,5,2,-7 n dw 5 min db ? Dseg ends Sseg segment para stack 'stack' dw 30 dup(0) Sseg ends Cseg segment para public 'code' ;основная программа osn proc near assume cs:cseg,ds:dseg,ss:sseg mov ax,dseg mov ds,ax mov cx,n ;cx=n mov al, mas ;al=mas[0] mov di,0 ;di=0 start: cmp al, mas[di] jle met mov al, mas[di] met: inc di loop start mov min, al mov ax, 4c00h int 21h osn endp cseg ends end osn
Решение задачи: «Найти сколько раз в массиве встречается минимальный элемент»
ORG 100h JMP start mess0 DB 13,10,'COUNT MIN: $' array DB 1,3,4,50,18,1,200,103,5,1,1,67,33 size = $ - array min DB 0FFh ; минимальный элемент start: ;================= ПОИСК МИНИМАЛЬНОГО ЗНАЧЕНИЯ ==================// MOV SI,array ; адрес массива MOV CX,size ; его длина findMin: ; LODSB ; берём от туда байт CMP AL,[min] ; JAE next ; больше минимального? MOV [min],AL ; нет - запоминаем его next: ; LOOP findMin ; сл.байт... ;================= СЧЁТЧИК НАЙДЕНЫХ МИН.ЭЛЕМЕНТОВ ===============// MOV SI,array ; MOV CX,size ; MOV BL,[min] ; искомый элемент XOR DX,DX ; счётчик сбрасываем в нуль count: ; LODSB ; читаем байт CMP AL,BL ; наш клиент? JNZ fuck ; нет - в топку его INC DL ; да - увеличиваем счётчик fuck: ; LOOP count ; сл.байт PUSH DX ; сохраняем выхлоп! print: MOV AH,9 ; MOV DX,mess0 ; INT 21h ; POP AX ; ADD AL,30h ; и на экран его.. INT 29h ; exit: ; XOR AX,AX ; INT 16h ; INT 20h ;
Объяснение кода листинга программы
ORG 100h — начало выполнения программы JMP start — переход к процедуре поиска минимального элемента mess0 DB 13,10,'COUNT MIN: $' — вывод сообщения с результатом подсчета array DB 1,3,4,50,18,1,200,103,5,1,1,67,33 - массив для поиска минимального элемента size = $ - array — размер массива min DB 0FFh — переменная для хранения минимального элемента start: MOV SI,array — перемещение указателя на начало массива MOV CX,size — инициализация счётчика размера массива findMin: LODSB — получение байта из массива CMP AL,[min] — сравнение текущего элемента с минимальным JAE next — если текущий элемент больше минимального, то переход к следующей итерации MOV [min],AL — иначе, текущий элемент становится минимальным next: LOOP findMin — переход к следующей итерации цикла count: MOV SI,array — перемещение указателя на начало массива MOV CX,size — инициализация счётчика размера массива MOV BL,[min] — инициализация счётчика найденных элементов XOR DX,DX — инициализация счётчика в нулевое значение LODSB — получение байта из массива CMP AL,BL — сравнение текущего элемента с искомым JNZ fuck — если текущий элемент не равен искомому, то переход к следующей итерации INC DL — иначе, увеличиваем счётчик на единицу fuck: LOOP count — переход к следующей итерации цикла print: MOV AH,9 — подготовка к выводу сообщения на экран MOV DX,mess0 — перемещение указателя на сообщение с результатом подсчета INT 21h — вывод сообщения на экран POP AX — восстановление регистра AX после вывода сообщения ADD AL,30h — добавление 30 к значению в регистре AX INT 29h — вывод значения в регистре AX на экран exit: XOR AX,AX — инициализация регистра AX в нулевое значение INT 16h — завершение работы программы INT 20h — завершение работы программы