Найти наиболее часто встречающееся в массиве число - 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:

Объяснение кода листинга программы

  1. Вначале, адрес массива с ответами сохраняется в стеке.
  2. Затем, в RSI загружается адрес исходного массива, а в RDI - адрес массива с ответами.
  3. RAX используется как счётчик для размера ответа.
  4. Происходит подсчёт количества каждого числа в исходном массиве, используя RSI как индекс для обоих массивов.
  5. Затем, находится наибольшее число во втором массиве, используя RDI как индекс.
  6. После этого, находятся индексы всех чисел во втором массиве, равных наибольшему числу, используя RDI и RSI как индексы.
  7. Наконец, результат сохраняется в массиве ответов.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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