- •Лучший курс лекций по лучшему языку программирования – языку ассемблера Блок управления памятью (mcb)
- •Программирование на Ассемблере для ibm pc
- •Программная модель 8086
- •Программная модель мп
- •Сегментная память
- •Вывод на экран
- •Вывод строки символов
- •Вывод на экран шестнадцатеричного числа
- •Процедуры
- •Ввод символов
- •Вывод на экран двоичного числа
- •Работа с дисковыми файлами
- •Префикс сегмента программы (psp)
- •Структура префикса программного сегмента.
- •Прерывания.
- •Табличные вызовы подпрограмм.
- •Макрокоманды.
- •Макроопределения.
- •Использование параметров в макроопределениях.
- •Директива local
- •Использование библиотек макроопределений.
- •Конкатенация. (&)
- •Директивы повторения.
- •Условные директивы.
- •Перечисление условных директив.
- •Пример использования ifnb.
- •Пример использования макроопределений.
- •Резидентные программы tsr (terminate and stay resident)
- •Защита резидентной программы от повторной загрузки.
- •Выгрузка резидентной программы.
- •Переключение стека в резидентной программе.
- •Обработчик прерываний от таймера
- •Контроллер прерываний и его программирование
- •Взаимодействие прикладных и системных обработчиков прерываний
- •Резидентный обработчик прерываний от клавиатуры с подключением до системного
- •Резидентный обработчик прерывания от клавиатуры с подключением после системного обработчика
- •Резидентный обработчик прерываний от клавиатуры с подключением как до, так и после системного.
- •Вывод на экран текста средствами bios
- •Режимы дисплея
- •Работа с видеобуфером.
- •Логическая организация текстового видеобуфера.
- •Программирование портов. Звук.
- •Программирование звукового канала таймера.
- •Интерфейс с Си
- •Программы с несколькими сегментами команд.
- •Программы с несколькими сегментами данных.
- •Директива assume. Инициализация сегментных регистров и замена сегментов.
- •Структуры и записи.
Программы с несколькими сегментами данных.
Вводя данные в сегменты команд мы можем увеличить общий объём команд, входящих в программу. Часто несложная программа обрабатывает большие массивы данных. Программы с одним сегментом команд и несколькими сегментами данных относятся к компактной модели памяти.
При наличии нескольких сегментов данных возникают проблемы их адресации. Поскольку процессор имеет только 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 байт длину команды.