Удалить из массива все элементы, которые встречаются больше двух раз - 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 ======================================|
Объяснение кода листинга программы
Код написан на ассемблере и предназначен для удаления из массива всех элементов, которые встречаются больше двух раз. Описание кода:
- Переменная
mess0
содержит строкуRESULT: $
. - Переменная
massiv
содержит массив из 16 элементов. - Переменная
size
содержит длину массиваmassiv
. - Переменная
buff
используется для временного хранения результатов. - Процедура
count_Digit
считает количество одинаковых символов в строке. - Функция
HEX2ASC
преобразует число из шестнадцатеричной системы счисления в ASCII-строку. Алгоритм работы программы: - Переменная
AH
устанавливается в 9, чтобы в дальнейшем использовать функциюINT 21h
для вывода строки. - Переменная
DX
устанавливается вmess0
, чтобы в дальнейшем использовать функциюINT 21h
для вывода строки. - Переменная
DI
устанавливается вbuff
, чтобы записывать результаты в этот буфер. - Переменная
DX
устанавливается вsize
, чтобы в дальнейшем использовать циклcompare
. - Цикл
compare
проходит по всем элементам массиваmassiv
. - Для каждого элемента выполняется функция
count_Digit
, которая считает количество одинаковых символов в строке. - Если количество повторов больше или равно 3, то элемент пропускается.
- Если количество повторов меньше 3, то текущее число записывается в буфер
buff
. - Цикл
print
проходит по всем элементам буфераbuff
. - Для каждого элемента выполняется функция
HEX2ASC
, которая преобразует число из шестнадцатеричной системы счисления в ASCII-строку. - Выводится результат на экран.
- В конце программы выполняется функция
exit
, которая завершает работу программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д