Найти наиболее часто встречающееся в массиве число - Assembler
Формулировка задачи:
Доброго времени суток, есть массив целых чисел, как найти наиболее часто встречающееся число? Помогите плз.
.model small .stack 100h .data massiv dw 80 dup(?) msg1 db 'Vvodite elementi massiva: $' msg2 db 'Massiv:$' .code start: mov ax,@data mov ds,ax mov ah,09h lea dx,msg1 int 21h xor dx,dx input_loop: mov ah,01h int 21h cmp al,0dh je number mov cl,al mov ax,dx xor ch,ch add ax,cx mov dx,ax jmp input_loop number: mov bx,cx shl bx,1 mov massiv[bx],dx inc cx jmp cont cont: xor dx,dx cmp cx, 30 je output cmp al,0dh je output jmp input_loop output: mov dx, massiv[bx] cmp dx, 0h je exit exit: mov ah,4ch int 21h end start
Решение задачи: «Найти наиболее часто встречающееся в массиве число»
textual
Листинг программы
// Адрес массива с ответами пусть изначально лежит в стеке // RSI - адрес исходного массива, затем адрес массива с ответами // RDI - адрес второго массива (временного) // RAX - номер максимального элемента исходного массива, затем размер ответа // Подсчёт того, сколько раз каждое число встречается в первом массиве xor rdx,rdx // Индекс в исходном массиве, адрес начала массива уже находится в RSI xor rcx,rcx // Обнуление старшей части регистра RCX, - понадобится сейчас для адресации @loop1: mov cl,[rsi+rdx] // В CL число из первого массива по индексу [RSI] add [rdi+rcx],1 // Само это число используется как индекс во втором массиве. Старшая часть RCX обнулена ранее. inc rdx // Следующий индекс исходного массива cmp rdx,rax // Всего в исходном массиве (RAX+1) элемент: от 0 до RAX jbe @loop1 // Поиск самого большого числа во втором массиве mov rdx,1 // Индекс во втором массиве, адрес начала массива всё ещё находится в RDI mov bl,[rdi] // В BL будет максимальное число. Изначально там нулевое число второго массива. @loop2: mov cl,[rdi+rdx] // Проверяемое число второго массива cmp bl,cl // Сравнивается с максимальным cmovb rbx,rcx // Если оно больше, то сохраняется в BL. Старшая часть RCX по-прежнему обнулена. inc rdx // Следующий индекс второго массива cmp rdx,255 // Всего во втором массиве 256 элементов: от 0 до 255 jbe @loop2 // Поиск индексов всех самых больших чисел второго массива. В BL уже находится самое большое число. pop rsi // Адрес массива с ответами восстановлен из стека xor rax,rax // Количество чисел в ответе. Изначально ноль. xor rdx,rdx // Индекс во втором массиве, адрес начала второго массива по-прежнему лежит в RDI @loop3: cmp bl,[rdi+rdx] // Поиск всех чисел второго массива, равных BL je @save_result inc rdx // следующий индекс второго массива cmp rdx,255 // всего во втором массиве 256 элементов: от 0 до 255 jbe @loop3 jmp @done @save_result: mov [rsi+rax],dl // Сохранение найденного в массив ответов inc rax // Увеличение индекса в массиве ответов inc rdx // следующий индекс второго массива cmp rdx,255 // всего во втором массиве 256 элементов: от 0 до 255 jbe @loop3 @done:
Объяснение кода листинга программы
- Вначале, адрес массива с ответами сохраняется в стеке.
- Затем, в RSI загружается адрес исходного массива, а в RDI - адрес массива с ответами.
- RAX используется как счётчик для размера ответа.
- Происходит подсчёт количества каждого числа в исходном массиве, используя RSI как индекс для обоих массивов.
- Затем, находится наибольшее число во втором массиве, используя RDI как индекс.
- После этого, находятся индексы всех чисел во втором массиве, равных наибольшему числу, используя RDI и RSI как индексы.
- Наконец, результат сохраняется в массиве ответов.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д