Удалить элементы массива, имеющие одинаковые значения - Assembler
Формулировка задачи:
Помогите дописать программу, я составил примерно, но плохо в этом всем понимаю.
Удалить элементы массива А(I) имеющие одинаковые значения. I=1,2,..,10, Определить количество оставшихся элементов.
Листинг программы
- masm
- model small
- .stack 256
- .data
- len equ 10
- n db 1,2,3,4,5,6,7,8,9,10
- .code
- start:
- mov ax, @data
- mov ds, ax
- mov count, 10
- xor si, di
- jcxz exit
- cikle1:
- xor ax, ax
- cmp n[si], n[di]
- je
- jmp m
- cikle2:
- inc si
- cmp si, di
- jne cikle1
- jmp exit
- m:
- mov di, si
- perem:
- mov bh, n[di+1]
- mov n[di], bh
- inc di
- mov cx, di
- inc cl
- cmp cl, count
- jne perem
- dec count
- dec si
- mov dl, count
- mov di, dx
- mov n[di], 0
- jmp cikle2
- exit:
- mov ax, 4c00h
- int 21h
- end start
Решение задачи: «Удалить элементы массива, имеющие одинаковые значения»
textual
Листинг программы
- .286
- .model tiny
- .code
- start:
- ; ищем повторяющиеся элементы и заменяем их на 0FFh
- mov cx,lenth+1
- mov bx,offset array
- a2: push cx
- mov al,[bx]
- cmp al,0FFh
- je a1
- mov di,bx
- inc di
- a0: repne scasb
- jcxz a1
- mov byte ptr [edi-1],0FFh
- loop a0
- a1: inc bx
- pop cx
- loop a2
- ; ищем элемены отличающиеся от 0FFh и сдвигаем их в начало массива
- ; таким образом происходит удаление из массива повторяющихся элементов
- mov al,0FFh
- a5: xor bx,bx
- mov cx,lenth
- mov di,offset array
- a4: repne scasb
- jcxz a3
- cmp al,[di]
- je a4
- xchg al,[di]
- xchg al,[di-1]
- mov bl,1
- jmp a4
- a3: cmp bx,1
- jz a5
- ; ищем первый элемент с кодом 0FFh, отнимаем от его адреса адрес начала
- ;массива, таким образом мы определяем количество оставшихся элементов.
- mov cx,lenth
- mov di,offset array
- mov si,di
- repne scasb
- sub di,si
- dec di
- ret
- array db 1,2,1,1,4,2,7,4,1,10
- lenth = $ - array
- end start;конец программы
Объяснение кода листинга программы
- .286 - указание на модель процессора
- .model tiny - указание на модель сегментации
- .code - начало кода
- start: - метка начала функции
- mov cx,lenth+1 - инициализация счётчика циклов
- mov bx,offset array - инициализация базового регистра
- a2: push cx - сохранение счётчика в стеке
- mov al,[bx] - получение значения элемента массива
- cmp al,0FFh - сравнение значения с 0FFh
- je a1 - если значение равно 0FFh, то переход на метку a1
- mov di,bx - запоминание адреса элемента
- inc di - увеличение значения регистра di
- a0: repne scasb - поиск повторяющихся элементов
- jcxz a1 - если счётчик равен нулю, то переход на метку a1
- mov byte ptr [edi-1],0FFh - замена повторяющегося элемента на 0FFh
- loop a0 - повторение шагов с 13 по 15
- a1: inc bx - увеличение значения регистра bx
- pop cx - восстановление значения счётчика из стека
- loop a2 - повторение шагов с 5 по 18
- mov al,0FFh - инициализация значения для поиска элементов, отличающихся от 0FFh
- a5: xor bx,bx - инициализация регистра bx
- mov cx,lenth - инициализация счётчика циклов
- mov di,offset array - инициализация базового регистра
- a4: repne scasb - поиск элементов, отличающихся от 0FFh
- jcxz a3 - если счётчик равен нулю, то переход на метку a3
- cmp al,[di] - сравнение значения с 0FFh
- je a4 - если значение равно 0FFh, то переход на метку a4
- xchg al,[di] - обмен значениями с элементом массива
- xchg al,[di-1] - обмен значениями с предыдущим элементом массива
- mov bl,1 - инициализация регистра bl
- jmp a4 - повторение шагов с 24 по 29
- a3: cmp bx,1 - проверка счётчика элементов, отличающихся от 0FFh
- jz a5 - если счётчик равен нулю, то переход на метку a5
- mov cx,lenth - инициализация счётчика циклов
- mov di,offset array - инициализация Базового регистра
- mov si,di - запоминание адреса начала массива
- repne scasb - поиск первого элемента с кодом 0FFh
- sub di,si - вычисление разницы между адресами
- dec di - уменьшение значения регистра di
- ret - завершение программы
- array db 1,2,1,1,4,2,7,4,1,10 - определение массива
- lenth = $ - array - вычисление длины массива
- end start;конец программы - завершение программы
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д