Удалить элементы массива, имеющие одинаковые значения - Assembler

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

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

Помогите дописать программу, я составил примерно, но плохо в этом всем понимаю. Удалить элементы массива А(I) имеющие одинаковые значения. I=1,2,..,10, Определить количество оставшихся элементов.
Листинг программы
  1. masm
  2. model small
  3. .stack 256
  4. .data
  5. len equ 10
  6. n db 1,2,3,4,5,6,7,8,9,10
  7. .code
  8. start:
  9. mov ax, @data
  10. mov ds, ax
  11. mov count, 10
  12. xor si, di
  13. jcxz exit
  14. cikle1:
  15. xor ax, ax
  16. cmp n[si], n[di]
  17. je
  18. jmp m
  19. cikle2:
  20. inc si
  21. cmp si, di
  22. jne cikle1
  23. jmp exit
  24. m:
  25. mov di, si
  26. perem:
  27. mov bh, n[di+1]
  28. mov n[di], bh
  29. inc di
  30. mov cx, di
  31. inc cl
  32. cmp cl, count
  33. jne perem
  34. dec count
  35. dec si
  36. mov dl, count
  37. mov di, dx
  38. mov n[di], 0
  39. jmp cikle2
  40. exit:
  41. mov ax, 4c00h
  42. int 21h
  43. end start

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

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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы