- •Лабораторная работа № 1
- •1. Цель и задача работы
- •2.1. Архитектура компьютера
- •2.2. Описание частей программы на языке ассемблера
- •2.3. Процедуры формирования исполняемой программы
- •3. Методика выполнения работы
- •4. Порядок выполнения работы
- •Контрольные вопросы
- •Лабораторная работа № 2 режимы адресации
- •1. Цель и задача работы
- •2. Основные теоретические сведения
- •3. Методика выполнения работы
- •4. Порядок выполнения работы
- •Контрольные вопросы
- •Варианты заданий
- •Лабораторная работа № 3 программирование ветвлений
- •1. Цель и задача работы
- •2. Основные теоретические сведения
- •2.1. Команды условного перехода
- •2.2. Команда безусловного перехода
- •3. Методика выполнения работы
- •4. Порядок выполнения работы
- •Контрольные вопросы
- •Варианты заданий
- •Лабораторная работа № 4 команды цикла и их использование в программах обработки
- •1. Цель и задача работы
- •2. Основные теоретические сведения
- •2.1. Арифметические операции над целыми числами
- •2.2. Организация циклов
- •3. Методика выполнения работы
- •4. Порядок выполнения работы
- •Контрольные вопросы
- •Варианты заданий
- •Лабораторная работа № 5 команды ввода-вывода на экран дисплея и их использование в программах обработки
- •1. Цель и задача работы
- •2. Основные теоретические сведения
- •2.1. Метод подъема
- •2.2. Команды прерывания
- •3. Методика выполнения работы
- •4. Порядок выполнения работы
- •Контрольные вопросы
- •Варианты заданий
- •Приложение в
2.2. Описание частей программы на языке ассемблера
Оператором (строкой) исходной программы может быть или команда, или директива (псевдооператор) Ассемблера. Команды выполняются в процессе решения задачи на компьютере, а директивы - в процессе ассемблирования (трансляции) программы. Следовательно, в отличие от команд директивы сообщают Ассемблеру (транслятору), что ему делать с командами и данными, которые вводятся в программе.
Сегменты, из которых состоит программа, описываются посредством директив. Подробная директива определения начала сегмента:
Имя сегмента SEGMENT [тип выравнивания (подгонки)] [тип связи] [‘класс’].
Тип выравнивания указывает, на границе слова (WORD ) или параграфа (PARA) должен быть установлен адрес начала сегмента. Выравнивание на границу параграфа означает, что адрес начала сегмента должен быть кратен 16 (на границе слова адрес кратен 2.
Тип связи (комбинирования сегментов) указывает, как нужно комбинировать одноименные сегменты различных модулей. По умолчанию предполагается PRIVATE, что означает, что сегмент не будет объединяться с сегментами с таким же именем вне данного модуля. Тип связи PUBLIC заставляет компоновщик объединить все сегменты с одинаковым именем в один сегмент. Объединенный сегмент будет непрерывным, все адреса данных или команд будут определяться относительно начала этого сегмента. В случае типа связи COMMON все сегменты с одним именем располагаются по одному адресу (перекрываются).
'Класс' - заключенная в кавычки строка символов определяет назначение сегмента и помогает компоновщику определить порядок следования сегментов внутри программы. Формально этот порядок может быть любым, но лучше, если все сегменты кода (содержат команды обработки) объединяются в общую группу. Заключенное в кавычки слово класс может принимать следующие значения: code, stack, data, что означает соответственно сегмент кода (команд программы), сегмент стека и сегмент данных.
Окончание сегмента определяется директивой:
Имя сегмента ENDS.
Между директивами начала и окончания сегмента записываются:
- для сегмента стека – директивы резервирования оперативной памяти. В этой области во время выполнения программы будут записываться результаты обработки, параметры вызываемых процедур, адреса возврата из процедур;
- в сегменте данных определяются структуры данных, переменные и константы;
- в сегменте кода – команды программы, которые выполняют заданное преобразование данных.
Ассемблер предлагает несколько способов упрощения определения сегментов. Однако, чтобы воспользоваться этой возможностью, необходимо определить модель памяти. Подробно об этом можно прочесть в литературе [1].
Каждый сегмент программы связывается с определенным сегментным регистром, который хранит адрес начала сегмента. Программист в директивах SEGMENT дает собственные имена сегментам, поэтому в начале программы (сегмента кода) должен связать имена сегментов с конкретными сегментными регистрами директивой
ASSUME CS: имя сегмента кода, DS: имя сегмента данных, SS: имя сегмента стека.
Например, в программе могут быть следующие директивы:
STACK SEGMENT PARA STACK ‘STACK’
. . . . . . . . . . . . .
STACK ENDS
DSEG SEGMENT PARA PUBLIC ‘DATA’
. . . . . . . . . . . . .
DSEG ENDS
CSEG SEGMENT PARA PUBLIC ‘DATA’
MAIN PROC FAR ; начало программы (основной процедуры)
ASSUME CS:CSEG, DS:DSEG, SS: STACK
. . . . . . . . . . .
MAIN ENDP ; конец процедуры
CSEG ENDS ; конец сегмента кода
END MAIN ; конец программы
Как видно из этого примера, программы обработки оформляется как основная процедура, начало которой определяется директивой имя процедуры PROC, а конец – директивой имя процедуры ENDP. Конец программы определяет директива END имя процедуры.
В реальной программе вместо точек полужирного шрифта записываются команды Ассемблера, а вместо точек обычного шрифта – директивы определения типов данных, следующего формата:
[имя] Dn выражение.
В этой директиве имя является идентификатором переменной или константы.
В любых языках программирования существуют, как минимум, два типа идентификаторов: имя переменной и имя метки. Выбор имен-идентификаторов во всех языках программирования подчиняется одинаковым правилам: идентификатор должен быть уникальным, должен начинаться с буквы или специального символа (такие имена нужно давать осторожно) и не должен совпадать с зарезервированными словами языка (в случае Ассемблера не может совпадать с именами регистров, мнемокодами команд и директив).
Собственно директива Dn используется для определения элементов данных: DB – определить байт; DW – определить слово в два байта; DD – определить двойное слово (четыре байта); DF – определить дальнее слово; DQ – определить учетверенное слово; DT – определить удесятеренное слово.
Выражение – операнд, который может указывать неинициализированное значение (в этом случае заносится знак ‘?’) или конкретное значение. В приложении Б приведена более подробная таблица директив, а в приложении В - примеры определения данных.
