Найти сколько раз в массиве встречается минимальный элемент - 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

Решение задачи: «Найти сколько раз в массиве встречается минимальный элемент»

textual
Листинг программы
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 — завершение работы программы

Оцени полезность:

12   голосов , оценка 3.75 из 5
Похожие ответы