Пузырьковая сортировка (поменять местами рядом стоящие элементы в массиве) - Assembler
Формулировка задачи:
Всём привет.
Необходимо реализовать пузырьковую сортировку массива. Пишу программу на masm32 через компилятор SASM.
Реализация этого алгоритма на С++:
Если с циклом в цикле я более-менее разобрался, то перестановка рядом стоящих элементов поставила меня в тупик. Буду благодарен, если кто-нибудь поможет с перестановкой)
for (int i = 0; i < length-1; i++) { for (int j = 0; j < length-i-1; j++) { if (a[j] > a[j+1]) { int b = a[j]; //change for elements a[j] = a[j+1]; a[j+1] = b;
.386 option casemap: none include \masm32\include\masm32rt.inc .data arr1 db -20, 14, 7, 16 arrLen dw $ - arr1 - 1 .code start: mov ecx, 0 mov eax, 0 mov ebx, 0 mov edx, 0 for_i: cmp bx, arrLen je output ;i=ebx j=edx mov edx, 0 for_j: mov cx, arrLen sub ecx, ebx cmp edx, ecx je smt ;здесь должны быть if и swap, но их нет) inc edx jmp for_j smt: inc ebx jmp for_i output: ;процедура вывода всех чисел массива на экран уже имеется ret end start
Решение задачи: «Пузырьковая сортировка (поменять местами рядом стоящие элементы в массиве)»
textual
Листинг программы
procedure Sort(Arr:pointer; Len:integer); asm cmp Len,1 jle @exit mov esi,Arr dec Len @m1:xor ecx,ecx @m2:mov eax,[esi+ecx*4] cmp eax,[esi+ecx*4+4] jng @next xchg eax,[esi+ecx*4+4] xchg eax,[esi+ecx*4] @next: inc ecx cmp ecx,Len jne @m2 dec Len jnz @m1 @exit: end;
Объяснение кода листинга программы
- Процедура Sort(Arr; Len: integer) - это описание функции, которая принимает два аргумента: указатель на массив
Arr
и длину массиваLen
. - asm - это ключевое слово, которое указывает, что следующий код написан на ассемблере.
- cmp Len, 1 - это сравнение длины массива с 1. Если массив пуст, то выполняется переход к выходу из процедуры.
- jle @exit - это переход к метке @exit, если условие (len <= 1) истинно.
- mov esi, Arr - это перемещение указателя на массив в регистр
esi
. - dec Len - это уменьшение длины массива на единицу.
- @m1: xor ecx, ecx - это инициализация счетчика циклов в 0.
- *@m2: mov eax, [esi+ecx4]** - это загрузка элемента массива в регистр
eax
с учетом индексаecx
. - *cmp eax, [esi+ecx4+4]** - это сравнение двух соседних элементов массива.
- jng @next - это переход к метке @next, если элементы уже упорядочены.
- *xchg eax, [esi+ecx4+4]** - это обмен местами элементов, если они не упорядочены.
- *xchg eax, [esi+ecx4]** - это обмен местами элементов, если они не упорядочены.
- @next: inc ecx - это увеличение счетчика циклов на единицу.
- cmp ecx, Len - это сравнение счетчика циклов с длиной массива.
- jne @m2 - это переход к метке @m2, если цикл не завершен.
- dec Len - это уменьшение длины массива на единицу.
- jnz @m1 - это переход к метке @m1, если цикл не завершен.
- @exit: - это метка, на которую происходит переход при выходе из процедуры.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д