Пузырьковая сортировка (поменять местами рядом стоящие элементы в массиве) - 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;

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

  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
Похожие ответы