Удалить элементы массива, имеющие одинаковые значения - 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;конец программы

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

  1. .286 - указание на модель процессора
  2. .model tiny - указание на модель сегментации
  3. .code - начало кода
  4. start: - метка начала функции
  5. mov cx,lenth+1 - инициализация счётчика циклов
  6. mov bx,offset array - инициализация базового регистра
  7. a2: push cx - сохранение счётчика в стеке
  8. mov al,[bx] - получение значения элемента массива
  9. cmp al,0FFh - сравнение значения с 0FFh
  10. je a1 - если значение равно 0FFh, то переход на метку a1
  11. mov di,bx - запоминание адреса элемента
  12. inc di - увеличение значения регистра di
  13. a0: repne scasb - поиск повторяющихся элементов
  14. jcxz a1 - если счётчик равен нулю, то переход на метку a1
  15. mov byte ptr [edi-1],0FFh - замена повторяющегося элемента на 0FFh
  16. loop a0 - повторение шагов с 13 по 15
  17. a1: inc bx - увеличение значения регистра bx
  18. pop cx - восстановление значения счётчика из стека
  19. loop a2 - повторение шагов с 5 по 18
  20. mov al,0FFh - инициализация значения для поиска элементов, отличающихся от 0FFh
  21. a5: xor bx,bx - инициализация регистра bx
  22. mov cx,lenth - инициализация счётчика циклов
  23. mov di,offset array - инициализация базового регистра
  24. a4: repne scasb - поиск элементов, отличающихся от 0FFh
  25. jcxz a3 - если счётчик равен нулю, то переход на метку a3
  26. cmp al,[di] - сравнение значения с 0FFh
  27. je a4 - если значение равно 0FFh, то переход на метку a4
  28. xchg al,[di] - обмен значениями с элементом массива
  29. xchg al,[di-1] - обмен значениями с предыдущим элементом массива
  30. mov bl,1 - инициализация регистра bl
  31. jmp a4 - повторение шагов с 24 по 29
  32. a3: cmp bx,1 - проверка счётчика элементов, отличающихся от 0FFh
  33. jz a5 - если счётчик равен нулю, то переход на метку a5
  34. mov cx,lenth - инициализация счётчика циклов
  35. mov di,offset array - инициализация Базового регистра
  36. mov si,di - запоминание адреса начала массива
  37. repne scasb - поиск первого элемента с кодом 0FFh
  38. sub di,si - вычисление разницы между адресами
  39. dec di - уменьшение значения регистра di
  40. ret - завершение программы
  41. array db 1,2,1,1,4,2,7,4,1,10 - определение массива
  42. lenth = $ - array - вычисление длины массива
  43. end start;конец программы - завершение программы

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


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

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

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