Иллюстрированный самоучитель по Assembler

Использование средств 32-разрядных процессоров в программировании

Пример 4.3. Пузырьковая сортировка.

0.586
assume CS:code,DS:data
code segment use16
main proc
mov AX, data; Настроим DS
mov DS,AX; на сегмент данных
mov ESI,offset list; ESI › начало массива
mov ECX,1000; Число элементов в массиве
start: mov EDX, 0; Индекс сравниваемой пары
sort: cmp EDX,ECX; Индекс пары дошел до
jge stop; индекса массива? К следующей паре
mov EAX,[ESI+EDX*4+4]; Второй элемент пары
cmp [ESI+EDX*4],EAX; Сравним с предыдущим
jge noswap; Если первый больше, то хорошо
xchg [ESI+EDXM], EAX; Первый меньше. Обменять
mov [ESI+EDXM + 4],EAX; первый на второй
noswap: inc EDX; Увеличим индекс пары
jmp sort; И на сравнение
stop: loop start; Цикл по всем элементам
mov AX,4C00h
int 21h
main endp
code ends
data segment
list label; Имя тестового массива
nmb=0; Заполним массив на этапе
rept 1000 /трансляции числами от 0
ddnmb /до 990
nmb=nmb+10 /через 10
endm
data ends
stk segment stack
dw 128 dup (0)
stk ends
end main

Алгоритм пузырьковой сортировки предусматривает выполнение двух вложенных циклов. Во внутреннем цикле сравниваются пары элементов. Первый элемент берется по адресу [ESI + EDX * 4], второй – по следующему адресу [ESI + EDX * 4 + 4]. Если второй элемент больше первого, происходит обмен значений этих элементов, и элемент с меньшим значением "всплывает" на одно место выше (т.е. перемещается по большему адресу). После этого увеличивается индекс пары и выполняется сравнение второго элемента со следующим. Если оказывается, что следующий элемент больше предыдущего, они меняются местами. В результате элемент с самым маленьким значением всплывает на самый верх списка.

Внутренний цикл, пройдясь по всем парам, повторяется сначала, обеспечивая всплывание следующего по величине элемента. Каждый следующий проход внутреннего цикла требует на 1 меньше шагов, чем предыдущий. После завершения упорядочивания элементы выстраиваются по возрастающим адресам в порядке уменьшения их значений.

В примере 4.3 тестовый массив данных образован из возрастающих (на 10) чисел от 0 до 990. В результате упорядочивания они должны расположиться в обратном порядке, от больших к меньшим. В примере не предусмотрены средства вывода на экран элементов массива, поэтому его изучение следует проводить в отладчике, наблюдая всплывание каждого элемента.

Как уже отмечалось, в 32-разрядных процессорах увеличено до 4 число сегментных регистров данных. Это дает возможность совместной работы с четырьмя сегментами данных (общим объемом до 256 Кбайт) без перенастройки сегментных регистров.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.