Лабораторная
работа №5
Тема: «Изучение среды и отладчика ассемблера»
Цель
работы: ознакомление с общими принципами построения программы на языке ассемблер.
Ход работы:
1. Изучить
теоретическую часть ( дополнительная информация в файле Структура COM и EXE
файлов.docx)
2.
Выполнить задание в соответствии с указаниями
3.
Ответить на контрольные вопросы
4.
Предъявить преподавателю результаты работы: проект и
исходный код
5.
Оформить отчет в соответствии с ходом работы
&Теоретическая часть:
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. По мере знакомства с синтаксисом языка будут приводиться
дополнительные правила.
GЗадание 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. Ваша первая программа выполнена.
GЗадание 2. Разработка
программы типа com на языке ассемблер
1.
Щелкните
на кнопку 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) вставим
следующие команды и скомпилируем программу заново.
GЗадание 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-ричной
системе счисления добавьте следующий код:
GКонтрольные задания:
Произвести расчет выражений:
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. Каковы этапы получения
выполняемого файла?
Оставьте свой комментарий
Авторизуйтесь, чтобы задавать вопросы.