1lab
.docxФедеральное агентство связи
Федеральное государственное бюджетное образовательное
учреждение высшего образования
Поволжский государственный университет
телекоммуникаций и информатики
Кафедра Информационных систем и технологий
Лабораторная работа №1
По дисциплине «Инструментальные средства информационных систем»
Тема: «Изучение основ программирования на языке
Ассемблера»
Руководитель доцент к. п. н.
__________________ Никитин К.А.
Самара 2018
-
Цель работы
Практическое овладение навыками составления простейших программ на языке Ассемблера и работы с программами TASM и TLINK.
Hello_1.LST
Hello_1.OBJ
-
Fail.bat
4.1. Команды и директивы ассемблера. Формат и отличия.
Исходный модуль программы на Ассемблере - последовательность строк, содержащих командные операторы и директивы, представляемая как функциональная единица для дальнейшей обработки. Каждая команда при трансляции генерирует машинный код команды, размер которого зависит от способов задания операндов.
Директивы Ассемблера позволяют управлять процессом ассемблирования и формирования листинга. Их используют для распределения памяти, обеспечения связи между программными модулями и работы с символическими именами. Часто их называют псевдокомандами. В отличии от команд директивы действуют только в процессе ассемблирования программы и не генерируют машинных кодов.
4.2. Какова цель сегментации памяти?
В сегменте данных программы определяются данные (переменные, символьные цепочки, массивы и др.) с которыми будет работать программа.
4.3. Что такое базовый адрес сегмента?
базовый адрес задает сегментный адрес области памяти, которая адресуется через этот сегментный регистр.
4.4. Какие значения может принимать базовый адрес сегмента?
Каков максимальный размер сегмента и почему?
Если ASSUME DS:DATA, SS:STK, CS:CODE, то это означает, что базовый адрес сегмента данных с именем DATA должен находиться в регистре DS, стека с именем STK – в регистре SS, а кода с именем CODE – в регистре CS. Тем не менее эта директива не освобождает программиста от начальной инициализации сегментных регистров.
4.5. Какие типы сегментов использует ассемблерная программа?
любые ассемблерные программы содержат, по крайней мере, один сегмент — сегмент кода. В некоторых программах используется сегмент для стековой памяти и сегмент данных (основной и дополнительный) для определения данных.
4.6. Какими директивами описывается сегмент?
Каждый из сегментов начинается с директивы SEGMENT (начало сегмента), которая обязательно должна иметь уникальное имя, и заканчивается директивой ENDS (конец сегмента) с тем же именем.
В сегменте данных программы определяются данные (переменные, символьные цепочки, массивы и др.) с которыми будет работать программа. Для определения данных чаще всего используются директивы DB (Define Byte) (определить байт), DW (Define Word) (определить слово), DD (Define Doubleword) (определить двойное слово), реже DQ (Define Quadword) (определить четыре слова) и DT (Define Tenbyte) (определить десять байт).
4.7. Как описываются различные типы данных, используемые программой?
Как описываются различные типы данных, используемые программой? В сегменте данных программы определяются данные (переменные, символьные цепочки, массивы и др.) с которыми будет работать программа. Для определения данных чаще всего используются директивы DB (Define Byte) (определить байт), DW (Define Word) (определить слово), DD (Define Doubleword) (определить двойное слово), реже DQ (Define Quadword) (определить четыре слова) и DT (Define Tenbyte) (определить десять байт). Директивы определения данных имеют следующий формат:
4.8. Каково назначение директивы ASSUME?
Перед первым использованием сегментных регистров и перед каждой точкой в программе, где их содержимое может измениться, необходима директива ASSUME (предположить, считать). Целесообразно располагать ее перед сегментом кодов. Директива имеет следующий формат:
ASSUME <SR: базовый адрес>, [<SR: базовый адрес>,], …
- здесь SR – сегментный регистр DS, SS, CS или ES, а базовый адрес задает сегментный адрес области памяти, которая адресуется через этот сегментный регистр. Задать базовые адреса сегментов можно с помощью их имен.
4.9. В чем заключается инициализация сегментных регистров?
begin: mov AX,text ; (3) Адрес сегмента команд загрузим
mov DS,AX ; (4) сначала в AX, затем в DS
В предложениях 3 и 4 выполняется инициализация сегментного регистра DS. Сначала значение имени text (т.е. адрес сегмента text) загружается командой mov (от move, переместить) в регистр общего назначения процессора AX, а затем из регистра AX переносится в регистр DS. Такая двухступенчатая операция нужна потому, что процессор в силу некоторых особенностей своей архитектуры не может выполнить команду непосредственной загрузки адреса в сегментный регистр. Приходится пользоваться регистром AX в качестве «перевалочного пункта». Инициализация (от англ. initialization, инициирование) — создание, активация, подготовка к работе, определение параметров. Приведение программы или устройства в состояние готовности к использованию.
4.10. Что такое ассемблирование и компоновка программы?
Ассемблирование - процесс трансляции программы с языка ассемблера в машинный код.
Компоновка - сборка исполнимого модуля из одного или нескольких объектных модулей.
4.11. Стандартное начало и окончание сегмента кодов.
Каждый из сегментов начинается с директивы SEGMENT (начало сегмента), которая обязательно должна иметь уникальное имя, и заканчивается директивой ENDS (конец сегмента) с тем же именем.
4.12. Каково содержание файлов с расширениями *.ASM, *.LST, *.OBJ, *.MAP, *.EXE?
Исходный модуль создается текстовым редактором и хранится в виде файла с расширением *.asm.
файлы – объектный (hello_1.obj) и листинга (hello_1.lst), файл карты сборки hello_1.map.
Компоновка объектных модулей с библиотечными модулями производится вызовом компоновщика tlink.exe из командной строки.
4.13. Метка и имя директивы. Назначение и отличия.
-
метка – определяемое пользователем имя команды, заканчивающееся двоеточием. Значением метки является адрес отмеченной команды. Используются для организации команд передачи управления. Метка состоит из последовательности символов или цифр, однако всегда начинается с символов английского алфавита или с символов @, _,?.
-
имя – имя директивы. Никогда не заканчивается двоеточием и имеет совершенно другой смысл по сравнению с меткой. Некоторые директивы обязательно должны иметь имя, у некоторых оно может отсутствовать;
-
Метка или имя является необязательным компонентом. Не во всех языках Ассемблеров эти понятия различаются. Если они различаются (например, MASM), то метка - точка программы, на которую передается управление, следовательно, метка стоит в предложении, содержащем команду; имя - имя переменной программы, ячейки памяти, следовательно, имя стоит в предложении, содержащем псевдокоманду резервирования памяти или определения константы. В некоторых случаях метка и имя могут отличаться даже синтаксически, так, в MASM/TASM после метки ставится двоеточие, а после имени - нет.
-
Физический смысл и метки, и имени - одинаков, это - адрес памяти. Во всех случаях, когда Ассемблер встречает в программе имя или метку, он заменяет ее на адрес той ячейки памяти, к которую имя/метка именует.
4.14. Для чего требуется помечать начальную команду программы меткой?
с тем чтобы к ним можно было обращаться (по именам, а не по адресам) из других частей программы (например, для передачи управления).
4.15. Как завершается исходный модуль программы?
Завершается исходный модуль директивой END, в качестве операнда которой используется точка входа в программу (метка первой команды). Тем самым сообщается Ассемблеру о достижении конца исходного модуля и дается указание начать выполнение программы с команды, помеченной меткой Start.