Пузырьковая сортировка (поменять местами рядом стоящие элементы в массиве) - 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: - это метка, на которую происходит переход при выходе из процедуры.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д