Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Финогенов-основы_языка_ассемблера.doc
Скачиваний:
46
Добавлен:
17.09.2019
Размер:
3.35 Mб
Скачать

Глава 4

;Пример 4-3. Пузырьковая сортировка

.586

assume CS:code,DS:data

code segment use!6

main proc

AX,data

DS,AX

ESI.offset list

ЕСХДООО

EDX,0

EDX,ECX

stop

; Настроим DS ;на сегмент данных ;ESI-> начало массива ;

;Число элементов в массиве ;Индекс сравниваемой пары ;Индекс пары дошел до ;индекса массива' К следующей паре ЕАХ,[Е51-ЬЕОХ*4+4];Второй элемент пары [ESI-f-EDX*4],EAX ;Сравним с предыдущим noswap ;Если первый больше, то хорошо

[ESI+EDX*4],EAX ;Первый меньше. Обменять [Е51+ЕОХ*4+4],ЕАХ;первый на второй

mov

mov

mov

mov

start: mov sort: cmp

jge

mov

cmp

jge

xchg

;Увеличим индекс пары

;И на сравнение

;Цикл по всем элементам

mov noswap: inc EDX

jmp sort stop: loop start

mov AX,4COOh

;Имя тестового массива ;3аполним массив на этапе ;трансляции числами от О ;до 990 ;через 10

hit 21h main endp code ends data segment list label nmb=0 rept 1000 dd nmb nmb=nmb+10 endm data ends stk segment stack ;.

dw 128 dup (0) С

stk ends II

end main

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

Расширенные возможности современных микропроцессоров

173

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

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

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

.586

datal segment use!6

; Массив 56 Кбайт

first dw 7000U dup(')

datal ends

data2 segment use 16

;Массив 56 .Кбайт

second dw 7000U dup (')

datal ends

data3 segment use 16

;Массив 56 Кбайт

third dw 7000h dup (')

data3 ends

data4 segment use 16

;Массив 56 Кбайт

forth dw 7000h dup (')

data4 ends

code segment

use!6

assume DS:datal,ES:data2,FS:data3,GS:data4 main proc

;Настроим все 4 сегментных регистра на базовые адреса соответствующих сегментов

mov AX.datal

mov DS,AX ;DS->datal

mov AX,data2

mov ES,AX ;ES->data2 • ' I

mov AX,data3

mov FS,AX ;FS->data3

mov AX,data4

mov GS,AX ;GS->data4

;Теперь можем обращаться к полям данных сегментов

mov BX,7000h*2-2 ;BX->последнее слово массива

mov word р1г[ВХ],111111;Обращение через DS по умолчанию ;Обращение к разным сегментам с явным указанием ^требуемого сегментного регистра (замена сегмента)

174