Лабораторная работа Изучение среды и отладчика ассемблера


Лабораторная работа №5
Тема: «Изучение среды и отладчика ассемблера»
Цель работы: ознакомление с общими принципами построения программы на языке ассемблер.
Ход работы:
Изучить теоретическую часть ( дополнительная информация в файле Структура COM и EXE файлов.docx)
Выполнить задание в соответствии с указаниями
Ответить на контрольные вопросы
Предъявить преподавателю результаты работы: проект и исходный код
Оформить отчет в соответствии с ходом работы
Теоретическая часть:
1.1 Структура ассемблерной программы
Каждый язык программирования имеет свои особенности. Язык ассемблера - не исключение. Традиционно первая программа выводит приветственное сообщение на экран ‘Hello World’.
В отличие от многих современных языков программирования в ассемблерной программе каждая команда располагается на ОТДЕЛЬНОЙ СТРОКЕ. Нельзя разместить несколько команд на одной строке. Не принято, также, разбивать одну команду на несколько строк.
Язык ассемблера является РЕГИСТРОНЕЧУВСТВИТЕЛЬНЫМ.Т. е. в большинстве случаев нет разницы между большими и малыми буквами. Команда может быть ДИРЕКТИВОЙ - указанием транслятору. Они выполняются в процессе превращения программы в машинный код. Многие директивы начинаются с точки. Для удобства чтения программы они обычно пишутся БОЛЬШИМИ БУКВАМИ. Кроме директив еще бывают ИНСТРУКЦИИ - команды процессору. Именно они и будут составлять машинный код программы.
1.2 Процесс обработки программы на языке ассемблера
Весь процесс технического создания ассемблерной программы можно разбить на 4 шага (исключены этапы создания алгоритма, выбора структур данных и т.д.).
Набор программы в текстовом редакторе и сохранение ее в отдельном файле. Каждый файл имеет имя и тип, называемый иногда расширением. Тип в основном используется для определения назначения файла. Например, программа на C имеет тип C, на Pascal - PAS, на языке ассемблера - ASM.
Обработка текста программы транслятором. На этом этапе текст превращается в машинный код, называемый объектным. Кроме того, есть возможность получить листинг программы, содержащий кроме текста программы различную дополнительную информацию и таблицы, созданные транслятором. Тип объектного файла - OBJ, файла листинга - LST. Этот этап называется ТРАНСЛЯЦИЕЙ.
Обработка полученного объектного кода компоновщиком. Тут программа "привязывается" к конкретным условиям выполнения на ЭВМ. Полученный машинный код называется выполняемым. Кроме того, обычно получается карта загрузки программы в ОЗУ. Выполняемый файл имеет тип EXE, карта загрузки - MAP. Этот этап называется КОМПОНОВКОЙ или ЛИНКОВКОЙ.
Запуск программы. Если программа работает не совсем корректно, перед этим может присутствовать этап ОТЛАДКИ программы при помощи специальной программы - отладчика. При нахождении ошибки приходится проводить коррекцию программы, возвращаясь к шагу 1. Таким образом, процесс создания ассемблерной программы можно изобразить в виде следующей схемы. Конечной целью, напомним, является работоспособный выполняемый файл HELLO. EXE.

1.3 Особенности создания ассемблерной программы в среде эмулятора EMU8086
Этот программный продукт содержит все необходимое для создания программы на языке Assembler.
Пакет Emu8086 сочетает в себе продвинутый текстовый редактор, assembler, disassembler, эмулятор программного обеспечения (Виртуальную машину) с пошаговым отладчиком, примеры.
1.4 Правила оформления ассемблерных программ
При наборе программ на языке ассемблера придерживайтесь следующих правил:
директивы набирайте большими буквами, инструкции - малыми;
пишите текст широко - не скупердяйничайте;
не выходите за край экрана, т.е. не делайте текст шире 80 знаков - его не удобно будет редактировать и печатать;
для отступов пользуйтесь табуляцией (клавиша TAB);
блоки комментариев задавайте с одинаковым отступом. Оптимальной считается такая строка:
<TAB><TAB>mov<TAB>ax,<пробел>bx< (1-3) TAB>; <пробел>текст комментария
Количество табуляций перед комментарием определяется длиной аргументов команды и может быть от 1 до 3. По мере знакомства с синтаксисом языка будут приводиться дополнительные правила.
Задание 1. Работа с эмулятором Emu8086
Emu8086 сочетает в себе мощный редактор исходного кода, ассемблер, дизассемблер, программный эмулятор (виртуальный ПК) с отладчиком и поэтапное обучение. Эта программа компилирует исходный код и выполняет его с помощью эмулятора шаг за шагом.
1. Запустите эмулятор и щелкните на кнопку new
2. Выберите тип исполняемого файла:

Директивы, определяющие тип исполнимого файла:
#MAKE_COM#
#MAKE_BIN#
#MAKE_BOOT#
#MAKE_EXE#
Вы можете вставить эти директивы в исходный код для определения нужного вам типа исполнимого файла.
Описание типов исполнимых файлов:
#MAKE_COM# - самый старый и самый простой формат исполнимого файла. Такие файлы загружаются с префиксом 100h (256 байтов).
#MAKE_EXE# - более "продвинутый" формат исполнимого файла. Не ограничены размер и количество сегментов.
#MAKE_BIN# - простой исполнимый файл.
#MAKE_BOOT# - эта директива копирует первую дорожку дискеты (загрузочный сектор).
3. Выберите "examples"- (Hello,world) из меню "File".
4. Щелкните кнопку [emulate] (или нажмите клавишу F5).
5. Щелкните кнопку [Single Step] (пошаговый режим) (или нажмите клавишу F8), и наблюдайте за выполнением кода.

В окне памяти: первая строка - смещение, вторая строка - значение hexadecimal, третья строка - десятичное значение, и последняя строка - значение символа ASCII.
Кнопка [Single Step] выполняет команды, один за другим останавливающие после каждой команды.
[Run] кнопка выполняет команды один за другим с задержкой, установленной задержкой шага между командами.
6. Дважды щелкните на текстовых полях регистра - открывается окно "Extended Viewer " со значением того регистра, преобразованного ко всем возможным формам. Вы можете изменять значение регистра непосредственно в этом окне.
7. Дважды щелкните на элементе списка памяти - открывается " Extended Viewer" со значением WORD, загруженным со списка памяти в выбранном местоположении.
Менее существенный байт - в младшем адресе: LOW BYTE загружен от выбранной позиции и HIGH BYTE от следующего адреса памяти. Можно изменять значение слова памяти непосредственно в окне "Extended Viewer", можно изменять значения регистров во времени выполнения, печатая по существующим значениям.
Кнопка [Flags] позволяет рассматривать и изменять флажки на времени выполнения.
В окне эмулятора вы можете запустить вашу программу на выполнение целиком (кнопка RUN) либо в пошаговом режиме (кнопка SINGLE STEP). Пошаговый режим удобен для отладки. Ну а мы сейчас запустим программу на выполнение кнопкой RUN. После этого (если вы не сделали ошибок в тексте программы) вы увидите сообщение о завершении программы (рис. 1.3). Здесь вам сообщают о том, что программа передала управление операционной системе, то есть программа была успешно завершена. Нажмите кнопку ОК в этом окне и вы увидите, наконец, результат работы вашей первой программы на языке ассемблера (рис. 1.4).

Рис. 1.3. Сообщение о завершении программы.

Рис. 1.4. Ваша первая программа выполнена.
Задание 2. Разработка программы типа com на языке ассемблер
Щелкните на кнопку New, выберите com и введите в строке «add your code here» следующие команды:

Рассмотрим исходный текст программы:
1 строка ORG 100h устанавливает значение программного счетчика (IP) в 100h, потому что при загрузке СОМ-файла в память DOS занимает первые 256 байт (100h) блоком данных PSP и располагает код программы только после этого блока. Все программы, которые компилируются в файлы типа СОМ, должны начинаться с этой директивы.
2 строка Метка BEGIN: располагается перед первой командой в программе и будет использоваться в директиве END (Begin - англ. начало; end - конец), чтобы указать, с какой команды начинается программа.
Вообще вместо слова BEGIN можно было бы использовать что-нибудь другое. Например, START:. В таком случае, нам пришлось бы и завершать программу END START.
Строки (3) - (5) выводят на экран сообщение “Hello”.
Команда MOV DX, OFFSET MESSAGE помещает в регистр DX смещение метки MESSAGE относительно начала сегмента данных, который в нашем случае совпадает с сегментом кода. OFFSET (по-английски - это смещение). Когда, при ассемблировании, Ассемблер дойдет до этой строки, он заменит OFFSET MESSAGE на АДРЕС (смещение) этой строки в памяти. Если мы запишем OFFSET MESSAGE (хотя, правильнее будет MOV DX, WORD OFFSET MESSAGE), то в DX загрузится не адрес (смещение), а первые два символа нашей строки (в данном случае "He"). Так как DX - шестнадцатиразрядный регистр, в него можно загрузить только два байта (один символ всегда один байт).
Команда INT 21H вызывает системную функцию DOS (int от англ. interrupt - прерывание). Прерывание MS-DOS - это своего рода подпрограмма (часть MS-DOS), которая находится постоянно в памяти и может вызываться в любое время из любой программы. Эта команда - основное средство взаимодействия программ с операционной системой. В примере вызывается функция DOS (строка 7) - вывести строку на экран. Эта функция выводит строку от начала, адрес которого задается в регистрах DS: DX, до первого встречного символа $. При запуске СОМ-файла регистр DS автоматически загружается сегментным адресом программы, а регистр DX был подготовлен предыдущей командой.
6 строка Команда RET пользуется обычно для возвращения из процедуры. DOS вызывается COM-программы так, что команда RET корректно завершает программу.
7 строка определяет строку данных, содержащую текст “ Hello ", управляющий символ ASCII возврат каретки с кодом ODh, управляющий символ ASCII перевод строки с кодом 0Ah и символ $, завершающий строку. Первое слово (message - сообщение) - название сообщения. Оно может быть любым (например, mess или string и пр). Управляющие символы (ODh и 0Ah) переводят курсор на первую позицию следующей строки.
8 строка директива END завершает программу, одновременно указывая, с какой метки должно начинаться ее выполнение.
2. В качестве дополнительного примера создадим еще одну строку, которую назовем message1. Затем, начиная со строки (6) вставим следующие команды и скомпилируем программу заново.

Задание 3. Создание программы типа *. ЕХЕ с использованием простых арифметических действий
Простые арифметические операторы.
1. Сложение.
Команда ADD (Addition - сложение (гл. to add - сложить)) осуществляет сложение первого и второго операндов. Исходное значение первого операнда (приемника) теряется, замещаясь результатом сложения. Второй операнд не изменяется. В качестве первого операнда команды ADD можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго - регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памяти. Операнды могут быть байтами или словами и представлять числа со знаком или без знака. Команду ADD можно использовать для сложения как обычных целых чисел, так и двоично-десятичных (с использованием регистра АХ для хранения результата). Команда воздействует на флаги OF, SF, ZF, AF, PF и CF.

Примеры:
mov al,10; загружаем в регистр AL число 10
add al,15; al = 25; al - приемник, 15 - источник
mov ax,25000; загружаем в регистр AX число 25000
add ax,10000; ax = 35000; ax - приемник, 10000 - источник
mov cx, 200; загружаем в регистр CX число 200
mov bx,760;а в регистр BX - 760
add cx,bx; cx = 960, bx = 760 (bx не меняется); cx - приемник, bx - источник
2 Вычитание.
Команда SUB (Subtraction - вычитание) вычитает второй операнд (источник) из первого (приемника) и помещает результат на место первого операнда. Исходное значение первого операнда (уменьшаемое) теряется. Таким образом, если команду вычитания записать в общем виде
SUB операнд1, операнд2
то ее действие можно условно изобразить следующим образом:
операнд1 - операнд2 - > операнд1
В качестве первого операнда можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго - регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памяти. Операнды могут быть байтами или словами и представлять числа со знаком или без знака. Команда воздействует на флаги OF, SF, ZF, AF, PF и CF.

Примеры:
mov al,10
sub al,7 - --> al = 3; al - приемник, 7 - источник
mov ax,25000
sub ax,10000 - --> ax = 15000; ax - приемник, 10000 - источник
mov cx,100
mov bx,15
sub cx,bx - --> cx = 85, bx = 15 (bx не меняется); cx - приемник, bx - источник
3 Инкремент (увеличение на 1).
Команда INC (Increment - инкремент) прибавляет 1 к операнду, в качестве которого можно указывать регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово.
Не допускается использовать в качестве операнда непосредственное значение. Операнд интерпретируется как число без знака. Команда воздействует на флаги OF, SF, ZF, AF и PF. Команда не воздействует на флаг CF; если требуется воздействие на этот флаг, необходимо использовать команду Add Op,l.
Команда INC (Increment - инкремент) увеличивает на единицу регистр или значение операнда в памяти.
Она эквивалентна команде ADD источник, 1 только выполняется гораздо быстрее.

Примеры:
mov al,15
inc al - --> теперь AL = 16 (эквивалентна add al,1)
mov dh,39h
inc dh - --> DH = 3Ah (эквивалентна add dh,1)
mov cl,4Fh
inc cl - --> CL = 50h (эквивалентна add cl,1)
4 Декремент (уменьшение на 1).
Команда DEC (Decrement - декремент) вычитает 1 из операнда, в качестве которого можно указывать регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение. Операнд интерпретируется как число без знака. Команда воздействует на флаги OF, SF, ZF, AF и PF.
Она эквивалентна команде SUB источник, 1 только выполняется гораздо быстрее.

Примеры:
mov al,15
dec al - --> теперь AL = 14 (эквивалентна sub al,1)
mov dh,39h
dec dh - --> DH = 38h (эквивалентна sub dh,1)
mov cl,4Fh
dec cl - --> CL = 4Dh (эквивалентна sub cl,1)
3. 2. Создание программ производящих сложение и вычитание.
1. Щелкните на кнопку New, выберите Exe и введите в строке «add your code here» следующие команды для расчета выражения:
(( 5 + ( AL – AH ) ) – BH ) + BL где AL=9, BL=3, AH=4, BH=6.
: ( № + AL ) – ( BH + AH ) – BL

Для вывода результирующего значения в 10-ричной системе счисления добавьте следующий код:

Контрольные задания:
Произвести расчет выражений:
1) ( № + AL ) – ( BH + AH ) – BL
2) ( ( BH + ( № – AH ) ) – BL ) + AL
где № - порядковый номер по журналу, AL=9, BL=3, AH=4, BH=6.
Контрольные вопросы:
1. Характеристика структуры файла типа *.com?
2. Какова структура ассемблерной программы?
3. С какой целью в код программы на ассемблере для DOS вводится строка ORG 100h?
4. Назначение команды MOV?
5. Прерывания 21h и 20h. Назначение?
6. Сущность и целесообразность использования команды RET вместо прерывания 20h?
6. Символ ‘$’ методика применения?
7. Связка “BEGIN: - END BEGIN". Правила применения?
8. Каковы этапы получения выполняемого файла?