
- •Программирование на языке Ассемблер
- •Классификация языков программирования
- •Поколения мп
- •Структура мп 8086
- •Регистры мп
- •Регистры общего назначения
- •Сегментные регистры
- •Регистры смещений
- •Регистр флагов
- •Структура и организация памяти
- •Сегментация памяти и формирование адреса
- •Особенности машинных команд
- •Основные команды мп
- •1.2 Перестановка (exchange):
- •1.3 Загрузка исполнительного адреса (load effective address):
- •3.1 Команды умножения
- •3.2 Команды деления
- •Переходы. Циклы
- •Команды сравнения и условного перехода
- •Команды условного перехода
- •3. Команды управления циклом
- •Язык Ассемблера ibm pc. Структура операторов и директив. Метки, переменные и их атрибуты
- •Команды
- •Директивы
- •Директивы определения данных
- •Конструкция повторения dup
- •Директива dd (define double word, определить двойное слово)
- •Директивы эквивалентности и присваивания
- •Структура программы. Логические сегменты
- •Побитовая обработка и ее основные виды
- •2. Команды сдвига
- •2.1. Логические сдвиги
- •2.2. Арифметические сдвиги
- •2.3. Циклические сдвиги
- •Стек и сегмент стека
- •Стековые команды
- •Пример использования стека
- •Модульное программирование
- •Типы объединения модулей
- •Связь Паскаль-Ассемблер
- •Параметры-значения
- •Параметры-переменные
- •Способы адресации
- •Команды строковых примитивов
- •Сканирование строки: scasb, scasw
- •Приемы обработки структурированной информации
- •Inc si ; к следующей оценке
- •Inc dx ; учет отличника
- •Составление и оформление программ на ассемблере
- •Префикс программного сегмента. Com- и exe-программы
- •Команда прерывания
- •Функции прерывания 21h
- •Процесс разработки программы на языке ассемблера
- •Трансляция программы
- •Компоновка программы
- •Макроповторения
- •Макрооператоры
- •Директива local
- •Директивы условного ассемблирования
- •Директивы if и ife
- •Директивы ifidn и ifdif
Стек и сегмент стека
Стек – это область оперативной памяти, доступ к которой осуществляется по принципу LIFO (Last In First Out (последним зашел – первым вышел) – элемент, записанный в стек последним, считывается из него первым).
Для стека можно отвести любую область памяти, однако ее размер не должен превышать 64 Кб и ее начальный адрес должен быть кратным 16. Эту область называют сегментом стека (рис. 1).
Рис. 1. Сегмент стека
Описание сегмента стека в программе на языке ассемблера:
S SEGMENT STACK
DB k DUP (?)
S ENDS
Стековые команды
2.1. Запись и чтение слов
Запись слова в стек: PUSH op
Допустимые типы операнда: r16, sr, m16.
op - >[ss:sp]
В команде PUSH в качестве операнда можно указывать любой сегментный регистр, (например, PUSH CS).
Чтение слова из стека: POP op
Допустимые типы операнда: r16, sr (кроме CS), m16.
[ss:sp] - > op
Слово, считанное из стека по команде POP, может быть помещено в любой регистр, кроме сегментного регистра CS.
Запись и чтение флагов
Запись регистра флагов в стек: PUSHF
Чтение регистра флагов из стека: POPF
Запись и чтение РОН
Запись регистров в стек: PUSHА
Чтение регистров из стека: POPА
AX, CX, DX, BX, SP, BP, SI, DI
3. Работа со стеком
Сохранение значений регистров
Пример:
PUSH СX
…….. ; использование СX
POP СX
Пересылка данных через стек
Пример:
Необходимо выполнить операцию X:=Y, где X и Y – переменные размером в слово:
PUSH Y
POP X ; X:=Y
Проверка на выход за пределы стека
SP=0? – стек полон?
SP=к? – стек пуст?
(к - размер сегмента стека в байтах)
Очистка и восстановление стека
ADD SP, 2*N ; очистка стека от N слов
MOV AX, SP
…….. ; записи в стек
MOV SP, AX
Доступ к элементам стека
Пример:
Пусть в стеке записано не менее трех слов. Требуется в регистр АХ записать копию третьего сверху элемента стека:
Адрес третьего слова стека равен адресу вершины стека плюс 4. Устанавливаем регистр BP на вершину стека и используем выражение [BP+4] для доступа к третьему слову:
MOV BP, SP
MOV AX, [BP+4] ; AX:=w3
Важно: при работе со стеком необходимо соблюдать баланс между командами записи в стек и чтения из стека.
Пример использования стека
В одномерном массиве сосчитать количество пар чисел, сумма которых равна 10.
Модульное программирование
Модуль – продукт процесса разбиения большой задачи на ряд более мелких функционально самостоятельных подзадач. Этот процесс называется функциональной декомпозицией задачи.
Между структурными единицами программы (модулями) существуют управляющие и информационные связи. Применительно к языку ассемблера рассматривают несколько форм организации управляющих связей:
Макроподстановки;
Объединение в одну программу подпрограмм, написанных на языке ассемблера;
Объединение в единый модуль подпрограмм, написанных на разных языках программирования.
В качестве информационных связей выделяют:
Общие области памяти и общие программно-аппаратные ресурсы процессора;
Унифицированная передача аргументов при вызове модуля;
Унифицированная передача аргументов при возвращении управления из модуля.