Пузырьковая сортировка (поменять местами рядом стоящие элементы в массиве) - Assembler

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

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

Всём привет. Необходимо реализовать пузырьковую сортировку массива. Пишу программу на masm32 через компилятор SASM. Реализация этого алгоритма на С++:
Листинг программы
  1. for (int i = 0; i < length-1; i++) {
  2. for (int j = 0; j < length-i-1; j++) {
  3. if (a[j] > a[j+1]) {
  4. int b = a[j]; //change for elements
  5. a[j] = a[j+1];
  6. a[j+1] = b;
Если с циклом в цикле я более-менее разобрался, то перестановка рядом стоящих элементов поставила меня в тупик. Буду благодарен, если кто-нибудь поможет с перестановкой)
Листинг программы
  1. .386
  2. option casemap: none
  3. include \masm32\include\masm32rt.inc
  4. .data
  5. arr1 db -20, 14, 7, 16
  6. arrLen dw $ - arr1 - 1
  7. .code
  8. start:
  9. mov ecx, 0
  10. mov eax, 0
  11. mov ebx, 0
  12. mov edx, 0
  13. for_i:
  14. cmp bx, arrLen
  15. je output
  16. ;i=ebx j=edx
  17. mov edx, 0
  18. for_j:
  19. mov cx, arrLen
  20. sub ecx, ebx
  21. cmp edx, ecx
  22. je smt
  23. ;здесь должны быть if и swap, но их нет)
  24. inc edx
  25. jmp for_j
  26. smt:
  27. inc ebx
  28. jmp for_i
  29. output:
  30. ;процедура вывода всех чисел массива на экран уже имеется
  31. ret
  32. end start

Решение задачи: «Пузырьковая сортировка (поменять местами рядом стоящие элементы в массиве)»

textual
Листинг программы
  1. procedure Sort(Arr:pointer; Len:integer);
  2. asm
  3. cmp Len,1
  4. jle @exit
  5. mov esi,Arr
  6. dec Len
  7. @m1:xor ecx,ecx
  8. @m2:mov eax,[esi+ecx*4]
  9.     cmp eax,[esi+ecx*4+4]
  10.     jng @next
  11.     xchg eax,[esi+ecx*4+4]
  12.     xchg eax,[esi+ecx*4]
  13.     @next:
  14.     inc ecx
  15.     cmp ecx,Len
  16.     jne @m2
  17. dec Len
  18. jnz @m1
  19. @exit:
  20. end;

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

  1. Процедура Sort(Arr; Len: integer) - это описание функции, которая принимает два аргумента: указатель на массив Arr и длину массива Len.
  2. asm - это ключевое слово, которое указывает, что следующий код написан на ассемблере.
  3. cmp Len, 1 - это сравнение длины массива с 1. Если массив пуст, то выполняется переход к выходу из процедуры.
  4. jle @exit - это переход к метке @exit, если условие (len <= 1) истинно.
  5. mov esi, Arr - это перемещение указателя на массив в регистр esi.
  6. dec Len - это уменьшение длины массива на единицу.
  7. @m1: xor ecx, ecx - это инициализация счетчика циклов в 0.
  8. *@m2: mov eax, [esi+ecx4]** - это загрузка элемента массива в регистр eax с учетом индекса ecx.
  9. *cmp eax, [esi+ecx4+4]** - это сравнение двух соседних элементов массива.
  10. jng @next - это переход к метке @next, если элементы уже упорядочены.
  11. *xchg eax, [esi+ecx4+4]** - это обмен местами элементов, если они не упорядочены.
  12. *xchg eax, [esi+ecx4]** - это обмен местами элементов, если они не упорядочены.
  13. @next: inc ecx - это увеличение счетчика циклов на единицу.
  14. cmp ecx, Len - это сравнение счетчика циклов с длиной массива.
  15. jne @m2 - это переход к метке @m2, если цикл не завершен.
  16. dec Len - это уменьшение длины массива на единицу.
  17. jnz @m1 - это переход к метке @m1, если цикл не завершен.
  18. @exit: - это метка, на которую происходит переход при выходе из процедуры.

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


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

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

15   голосов , оценка 4 из 5

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

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

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