Вы описываете простой алгоритм Bubble Sort в соответствии с http://en.wikipedia.org/wiki/Bubble_sort:
. ".String" - это просто массив символов.Последний символ имеет значение 0, чтобы определить конец строки.Символ кодируется как 8-битное значение.Таким образом, вам нужно только использовать 8-битные регистры процессора (AL, AH, DL, DH и т. Д.) Для их обработки.Вы можете использовать 32-разрядные расширенные регистры (EAX, EBX, ECX, EDX и т. Д.), Но это излишне усложняет ситуацию.
Bubble Sort требуется два вложенных цикла.В этом случае бесконечный внешний цикл, который заканчивается при сортировке строки, и внутренний цикл, который обрабатывает каждый символ.
Следующий пример очень прост.Например, последнее отсортированное письмо излишне сравнивается снова и снова.У него большой потенциал для улучшения:
# Name: bubblesort.s
# Assemble & link: gcc -m32 -obubblesort bubblesort.s
# Run: ./bubblesort
.data
fmt: .string "%s\n"
str: .string "lhtgbvfmjnbcdsaawcfr"
.text
.global main
main:
pushl $str # Address of str onto the stack
pushl $fmt # Address of fmt onto the stack
call printf # Call libc: printf(fmt,str)
addl $(4*2), %esp # Adjust the stack by 2 PUSHes
O1: # Outer loop ends when everything is sorted (swapped == false)
movl $str, %esi
movb $0, %dl # swapped = false
I1: # Inner loop: every character
movb (%esi), %al
movb 1(%esi), %ah
cmpb $0, %ah # End of string?
je O2 # Yes -> exit inner loop
cmpb %ah, %al # Compare the characters
jbe I2 # If AL < AH, don't swap the characters
movb $1, %dl # swapped = true
movb %al, 1(%esi) # Swap: Store the characters in reversed order
movb %ah, (%esi)
I2:
incl %esi # Next character
jmp I1
O2:
pushal # Preserve all registers
pushl $str # Address of str onto the stack
pushl $fmt # Address of fmt onto the stack
call printf # Call libc: printf(fmt,str)
addl $(4*2), %esp # Adjust the stack by 2 PUSHes
popal # Restore all registers
cmpb $1, %dl # swapped == true?
je O1 # Yes -> one more outer loop
Done:
ret # Return: exit the main function
А вот еще одна «анимированная» иллюстрация:
https://www.youtube.com/watch?v=lyZQPjUT5B4