Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ASM_lectures.doc
Скачиваний:
27
Добавлен:
28.04.2019
Размер:
992.77 Кб
Скачать

Программы с несколькими сегментами данных.

Вводя данные в сегменты команд мы можем увеличить общий объём команд, входящих в программу. Часто несложная программа обрабатывает большие массивы данных. Программы с одним сегментом команд и несколькими сегментами данных относятся к компактной модели памяти.

При наличии нескольких сегментов данных возникают проблемы их адресации. Поскольку процессор имеет только 2 сегментных регистра данных DS и ES (в процессах 80386 и 80486 предусмотрены дополнительные сегментные регистры FS и GS), то в каждый момент времени программе могут быть доступны лишь 2 сегмента данных общим объёмом 128Кбайт. Если число сегментов данных больше 2-х, работать с ними придётся последовательно, предварительно настраивая сегментные данных на требуемую пару сегментов.

Рассмотрим программу с двумя сегментами данных. В программе создаётся текстовый массив данных объёмом 32Кбайта, который затем сортируется по признаку четности или нечётности числа установленных битов в каждом байте массива. Байтами с чётным числом битов заполняется один выходной массив, байтами с нечётным числом битов- другой. Поскольку количество тех и других байтов заранее неизвестно, под выходные массивы выделяется по 32Кб. Эти массивы размещаются во втором сегменте данных, адресуемого через регистр ES.

assume CS:text, DS:data1

main proc

mov AX,data1 ;настройка DS на

mov DS,AX ;первый сегмент data1

mov AX, data2 ;настройка ES

mov ES, AX ;на второй сегмент data2

;Заполним исходный массив raw натуральным рядом чисел

mov CX,32768 ;счётчик цикла

mov BX,0 ;индекс в массиве raw

mov DL,0 ;число-заполнитель, начнём с нуля

Fill: mov raw[BX],DL ;отправим число в исходный массив

Inc DL ;образуем следующее число

Inc BX ;к следущим байтам

Loop Fill ;цикла

;Рассортируем числа из массива raw по 2-м массива сегмента data2:

;в массив evenbit-байты с чётным числом установленных битов

;в массив oddbit- с нечётным

mov CX, 32768 ;счётчик цикла

mov BX, 0 ;индекс в чётный массив

mov SI, 0 ;индекс в массив чётных битов evenbit

mov DI,0 ;индекс в массив нечётных битов oddbit

pros: mov DL,raw[BX] ;получим байт из массива raw

test DL,0FFh ;проверим его чётность

pushf ;сохраним в стеке результаты проверки

inc BX ;инкримент индекса в массиве raw

popf ;восстановим флаги процессора

jp parity ;если чёт- переход на parity

mov ES:oddbit[DI],DL ;нечёт- в массив нечётных битов

inc DI ;инкримент его указателя

jmp outc ;и на следующий шаг цикла

parity: mov ES:evenbit[SI], DL ;чётно-в массив чётных байтов

inc SI ;инкримент

outc: loop proc ;повторять CX раз

main endp

text ends

data1 segment

raw DB 32768 dup(0)

data1 ends

data2 segment

oddbit DB 32768 dup(0)

evenbit DB 32768 dup(0)

data2 ends

В программе предусмотрены 2 сегмента данных data1 и data2. Сегментный регистр DS будет использоваться для работы с первым из них, поэтому в операторе assume имеется определение DS:data1. Программа начинается с настройки своих сегментных регистров. Далее осуществляется заполнение исходного массива. Для простоты массив заполняется натуральным рядом чисел, которые повторяются с шагом 256. Сортировка осуществляется в цикле. Чётность или нечётность числа установленных в байты битов определяется с помощью пары test jp(jmp if parity) . Двух операндная команда test фактически выполняет орперацию логического AND над двумя операндами и в зависимости от результата устанавливает флаги ZF,SF и PF.

Pushf-позволяет отсрочить условный переход.

В командах записи в память содержимого DL регистр ES указан в явной форме. Если опустить ES, адресация осуществлялась бы через DS. Префикс замены сегмента увеличивает на 1 байт длину команды.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]