
Лабораторная работа №1.
Изучение инструментальных средств для
программирования на языке Assembler (4 часа)
1. Цель работы
Научиться работать с пакетом программирования на языке Assembler MASM – вводить, редактировать и отлаживать программы, использовать встроенную помощь, исследовать выполнение простых программ.
2. Программа работы
2.1. Изучить основные теоретические сведения, приведенные в методических указаниях и дополнительной литературе по работе с программным пакетом MASM.
2.2. Записать в отчет порядок работы с пакетом MASM, начиная от этапа запуска и настройки пакета и заканчивая компиляцией результирующего кода.
2.3. Исследовать возможности пакета MASM по вводу, редактированию, ассемблированию и отладке на примере предлагаемых тестовых программ.
2.4. Ознакомиться с правилами применения и рассмотреть особенности работы команд суммирования ADD, ADC, INC и вычитания SUB, SBB, DEC, NEG, а также команды сравнения СМР.
2.5. Переписать в отчет и выполнить программы 1 и 2, приведенные в п.4.
3. Основные теоретические сведения
Язык программирования Assembler, представляет собой максимально приближенный к процессорному уровню инструмент для работы с программами. Особенностью языка Assembler является система записи программы с детализацией до отдельной процессорной команды, процессорного регистра и физических адресов ячеек памяти. В Assembler’е используется фактически символьная форма записи машинного языка: вместо цифровых кодов операций выписываются знаки операций или их словесные названия, вместо адресов – имена, а константы, при этом, можно записывать в десятичной системе счисления. Составленная в таком виде программа вводится в компьютер в текстовом виде и подается на вход транслирующей программе, называемой ассемблером. Ассемблер переводит текст программы непосредственно в процессорные команды.
Программирование на Assembler’е позволяет в максимальной степени использовать особенности архитектуры вычислительного комплекса. Как правило, программа написанная на этом языке является наиболее быстродействующей и обладает наименьшими требованиями к памяти вычислительного комплекса.
В настоящее время на Assembler’е, как правило, пишутся драйверы нижнего уровня для работы непосредственно с аппаратными средствами вычислительных систем и их периферии, микроядро ОС, BIOS микропроцессорных систем, программы для специализированных систем – встроенных систем на микроконтроллерах и специализированных микропроцессорах, управляющих работой разнообразных устройств.
3.1. Алгоритм работы с ассемблером
Рассмотрим, по какому алгоритму производится работа с ассемблером в общем случае.
1. Ввод программы.
Исходный текст программы вводится в текстовом редакторе или, при возможности, средствами используемого программного пакета ассемблера. Желательно соблюдать определенный формат текстовых блоков: метки, команды, операнды и комментарии желательно выравнивать в колонки для удобочитаемости программы при дальнейшей ее отладке.
Ввод программы завершается проверкой его правильности.
2. Трансляция исходного кода в объектный код.
На этом шаге происходит первичный анализ ассемблером текста программы на наличие синтаксических ошибок и трансляция исходного текста в машинный объектный код и генерация OBJ-модуля. Этот модуль уже приближен к исполняемой форме, но еще не готов к выполнению.
Как правило, в процессе трансляции, ассемблер делает два просмотра или «прохода» исходного текста. В первом проходе ассемблер просматривает всю исходную программу и строит таблицу идентификаторов, используемых в программе – имен полей данных и меток программы и их относительных адресов в программе. Кроме этого в первом проходе подсчитывается ориентировочный объем объектного кода, но сам объектный код не генерируется.
Во втором проходе ассемблер использует таблицу идентификаторов, построенную в первом проходе. Поскольку уже известны длины и относительные адреса всех полей данных и команд, то ассемблер может сгенерировать объектный код для каждой команды.
3. Компоновка исполняемого кода программы.
Компоновка включает в себя преобразование OBJ-модуля в исполнимый модуль, содержащий машинный код. При этом компоновщик выполняет следующее:
-завершает формирование в OBJ-модуле адресов, которые остались неопределенными после ассемблирования;
- компонует, если необходимо, более одного отдельно ассемблированного модуля в одну исполняемую программу или две или более ассемблерных программ или ассемблерную программу с программами, написанными на языках высокого уровня;
- инициализирует ЕХЕ-модуль командами загрузки для выполнения.
4. Тестирование исполняемой программы.
После того как будет получен окончательный машинный код написанной программы, наступает этап тестирования и отладки. На этом этапе производят тестовые запуски программы в машинном коде и в случае необходимости вносят изменения в программу. Однако корректируют при этом исходный текст на Assembler’е ассемблируют его в новый OBJ-модуль и компонуют полученный объектный модуль в новый исполняемый ЕХЕ-модуль.
Предложения языка Assembler описывают команды или псевдокоманды – директивы. Предложения команды задают машинные команды вычислительной системы, обработка ассемблером команды приводит к генерации машинного кода. Обработка же директивы приводит к управлению самим ассемблером. Каждое новое предложение языка начинается с новой строки и занимает, как правило, одну строку. Формат записи предложения может быть жестким или свободным. При жестком формате компоненты предложения должны располагаться в фиксированных позициях строки. Как правило, при жестком формате записи, для упрощения форматирования текста программы создаются бланки.
При свободном формате записи программ допускается любое количество пробелов между составляющими предложения.
В общем случае предложения языка Assembler состоят из следующих компонент:
- метка или имя фрагмента программы (подпрограммы, процедуры);
- мнемоника команды;
- операнды, необходимые для выполнения команды;
- комментарии.
Метка или имя являются необязательными компонентами. Метка - точка программы на которую передается управление, следовательно, метка стоит в предложении, содержащем команду. Имя – имя переменной программы, или ячейки памяти. Как правило, метка и имя отличаются синтаксически – после метки ставится двоеточие, а после имени – нет.
Физический смысл метки и имени одинаков – они обозначают адрес памяти, по которому располагаются необходимые для процессора данные. Во всех случаях, когда ассемблер встречает в программе имя или метку, он заменяет ее на адрес той ячейки памяти, которую эта метка именует. Способ преобразования имени в значение адреса зависит от принятых способов адресации для конкретного процессора.