
- •140010, Г. Люберцы, Московской обл., Октябрьский пр-т, 403.
- •Глава 1. Архитектура реального режима
- •1.1. Память и процессор
- •Глава 1
- •Глава 1
- •1.2. Распределение адресного пространства
- •Глава 1
- •1.3. Регистры процессора
- •Глава 1
- •Глава 1
- •9 7H Шестнадцатернчное обозначение числа
- •Глава 1
- •1.4. Сегментная структура программ
- •Глава 1
- •Глава 1
- •Глава 1
- •1.5. Стек
- •Глава 1
- •1.6. Система прерываний
- •Глава 1
- •Глава I
- •1.7. Система ввода-вывода
- •Глава I
- •Глава 1
- •Глава 2. Основы программирования
- •2.1. Подготовка и отладка программы
- •Глава 2
- •Глава 2
- •Глава 2
- •Глава 2
- •Глава 2
- •2.2. Представление данных
- •Глава 2
- •Глава 2
- •2.3. Описание данных
- •Глава 2
- •Глава 2
- •2.4. Структуры и записи
- •Глава 2
- •Глава 2
- •2.5. Способы адресации
- •Глава 2
- •Глава 2
- •Глава 2
- •Глава 2
- •Глава 2
- •Глава 2
- •Глава 2
- •Глава 2
- •Глава 2
- •Глава 2
- •2.7. Вызовы подпрограмм
- •Глава 2
- •2.8. Макросредства ассемблера
- •Глава 2
- •Глава 2
- •Глава 2
- •Глава 3. Команды и алгоритмы
- •Глава 3
- •Глава 3
- •Глава 3
- •Глава 3
- •Глава 3
- •Глава 3
- •Глава 3
- •Глава 3
- •3.2. Циклы и условные переходы
- •Глава 3
- •Глава 3
- •3.3. Обработка строк
- •Глава 3
- •3.4. Использование подпрограмм
- •Глава 3
- •Глава 3
- •3.5. Двоично-десятичные числа
- •Глава 3
- •Глава 3
- •3.6. Программирование аппаратных средств
- •Глава 3
- •37Ah Порт управлсш!я
- •Глава 3
- •Глава 3
- •Глава 4. Расширенные возможности
- •4.1. Архитектурные особенности
- •Глава 4
- •4.2. Дополнительные режимы адресации
- •Глава 4
- •4.3. Использование средств 32-разрядных процессоров в программировании
- •Глава 4
- •Глава 4
- •Глава 4
- •4.4. Основы защищенного режима
- •Глава 4
- •Глава 4
- •Глава 4
- •Глава 4
- •Idiv Деление целых чисел со знаком
- •Imul Умножение целых чисел со знаком
- •In Ввод из порта
- •Inc Инкремент (увеличение на 1)
- •Int Программное прерывание
- •Into Прерывание по переполнению
- •Iret Возврат из прерывания
- •1 Lods Загрузка операнда из строки : lodsb Загрузка байта из строки lodsw Загрузка слова из строки
- •Операнд
- •Xadd память, регистр
- •Xchg Обмен данными между операндами
- •Xlat Табличная трансляция
- •Xor Логическое исключающее или
- •Содержание
Глава 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 .Кбайт
datal ends
data3 segment use 16
;Массив
56 Кбайт
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