Удалить из массива все элементы, которые встречаются больше двух раз - Assembler

Узнай цену своей работы

Формулировка задачи:

Дан целочисленный массив размера N. Удалить из массива все элементы, которые встречаются больше двух раз. Помогите пожалуйста!

Решение задачи: «Удалить из массива все элементы, которые встречаются больше двух раз»

textual
Листинг программы
ORG 100h
JMP start
 
mess0    DB  'RESULT: $'
massiv   DB  88,27,1,62,10,33,91,2,1,10,13,1,88,10,10,33,1,88
size     =   $ - massiv     ; длина массива
buff     DB  32 DUP(0)      ; буфер для результата
 
start:
   MOV   AH,9               ;
   MOV   DX,mess0           ;
   INT   21h                ;
   MOV   DI,buff            ; сюда будем писать
   MOV   SI,massiv          ; от сюда - читать
   MOV   DX,size            ; кол-во повторов (длина строки)
 
compare:                    ;
   MOV   AH,BYTE[SI]        ; Берём число
   CALL  count_Digit        ; сколько раз оно встретилось в массиве?
   CMP   BX,3               ; проверка на 3.
   JAE   next               ; если больше/равно, то пропускаем число
   XCHG  AH,AL              ; иначе: текущее число у нас в AH
   STOSB                    ; кидаем его в AL, и записываем в буфер!
next:                       ;
   INC   SI                 ; следующее число массива..
   DEC   DX                 ; уменьшаем его длину
   OR    DX,DX              ; это последнее число в массиве?
   JNZ   compare            ; нет - мотаем цикл..
 
   MOV   CX,DI              ; Отсеянные числа у нас в буфере.
   SUB   CX,buff            ; СХ = его длина
   MOV   SI,buff            ; травим SI на буфер (для LODSB)
print:                      ;
   XOR   AH,AH              ; обнуляем мусор
   LODSB                    ; читаем число из буфера
   MOV   BX,10              ; выводить на экран будем в DEC
   CALL  HEX2ASC            ; есть контакт!
   MOV   AL,','             ; вставим разделитель
   INT   29h                ;
   LOOP  print              ; мотаем цикл СХ-раз...
 
exit:                       ;
   XOR   AX,AX              ;
   INT   16h                ;
   INT   20h                ; на выход!
 
;ннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн;
; Процедура:  "count_Digit" считает кол-во одинаковых символов в строке   ;
;  На входе:  АН = число/символ для поиска                                ;
;             СХ = длина строки                                           ;
;             SI = адрес строки                                           ;
; На выходе:  ВХ = количество найденых символов                           ;
;ннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн;
count_Digit:                ;
   PUSH  SI                 ; SI нам нужен. сохраним его
   MOV   SI,massiv          ;
   MOV   CX,size            ;
   XOR   BX,BX              ; сбросим счётчик в нуль
@@1:                        ;
   LODSB                    ; читаем в AL из SI
   CMP   AH,AL              ;
   JNZ   @@2                ; прыг, если не совпало с фактором
   INC   BX                 ; иначе: счётчик +1
@@2:                        ;
   LOOP  @@1                ; обрабатываем строку до конца...
   POP   SI                 ;
RET                         ;
 
;ннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн;
;   Функция:  "HEX2ASC" выводит на экран слово в различных СС             ;
;  На входе:  АХ = число для вывода                                       ;
;             ВХ = система счисления                                      ;
;ннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн;
HEX2ASC:                    ;
   PUSHA                    ;
   MOV   BX,10              ;
   XOR   CX,CX              ;
isDiv:                      ;
   XOR   DX,DX              ;
   DIV   BX                 ;
   PUSH  DX                 ;
   INC   CX                 ;
   OR    AX,AX              ;
   JNZ   isDiv              ;
isOut:                      ;
   POP   AX                 ;
   CMP   AL,9               ;
   JLE   noHex              ;
   ADD   AL,7               ;
noHex:                      ;
   ADD   AL,30h             ;
   INT   29h                ;
   LOOP  isOut              ;
   POPA                     ;
RET                         ;
;============================ E O F ======================================|

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

Код написан на ассемблере и предназначен для удаления из массива всех элементов, которые встречаются больше двух раз. Описание кода:

  1. Переменная mess0 содержит строку RESULT: $.
  2. Переменная massiv содержит массив из 16 элементов.
  3. Переменная size содержит длину массива massiv.
  4. Переменная buff используется для временного хранения результатов.
  5. Процедура count_Digit считает количество одинаковых символов в строке.
  6. Функция HEX2ASC преобразует число из шестнадцатеричной системы счисления в ASCII-строку. Алгоритм работы программы:
  7. Переменная AH устанавливается в 9, чтобы в дальнейшем использовать функцию INT 21h для вывода строки.
  8. Переменная DX устанавливается в mess0, чтобы в дальнейшем использовать функцию INT 21h для вывода строки.
  9. Переменная DI устанавливается в buff, чтобы записывать результаты в этот буфер.
  10. Переменная DX устанавливается в size, чтобы в дальнейшем использовать цикл compare.
  11. Цикл compare проходит по всем элементам массива massiv.
  12. Для каждого элемента выполняется функция count_Digit, которая считает количество одинаковых символов в строке.
  13. Если количество повторов больше или равно 3, то элемент пропускается.
  14. Если количество повторов меньше 3, то текущее число записывается в буфер buff.
  15. Цикл print проходит по всем элементам буфера buff.
  16. Для каждого элемента выполняется функция HEX2ASC, которая преобразует число из шестнадцатеричной системы счисления в ASCII-строку.
  17. Выводится результат на экран.
  18. В конце программы выполняется функция exit, которая завершает работу программы.

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


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

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

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