Работа с эмулятором Emu8086. Особенности создания ассемблерной программы в среде эмулятора EMU8086
Практическая работа №10
Изучение интерфейса учебной микроЭВМ, программной модели эмулятора универсального однокристального микропроцессора
Цель: Изучение принципов построения и работы программной модели эмулятора универсально однокристального микропроцессора
Порядок выполнения
- Изучить теоретическую часть
- Выполнить практический пример
- Реализовать полученный алгоритм на языке Ассемблера
- Выполнить тестирование программы
- Ответить на контрольные вопросы
- Оформить отчет по проделанной работе
Теоретическая часть
Cтруктура ассемблерной программы
Каждый язык программирования имеет свои особенности. Язык ассемблера – не исключение. Традиционно первая программа выводит приветственное сообщение на экран ‘Hello World’.
В отличие от многих современных языков программирования в ассемблерной программе каждая команда располагается на ОТДЕЛЬНОЙ СТРОКЕ. Нельзя разместить несколько команд на одной строке. Не принято, также, разбивать одну команду на несколько строк.
Язык ассемблера является РЕГИСТРОНЕЧУВСТВИТЕЛЬНЫМ.
Т. е. в большинстве случаев нет разницы между большими и малыми буквами. Команда может быть ДИРЕКТИВОЙ – указанием транслятору. Они выполняются в процессе превращения программы в машинный код. Многие директивы начинаются с точки. Для удобства чтения программы они обычно пишутся БОЛЬШИМИ БУКВАМИ. Кроме директив еще бывают ИНСТРУКЦИИ – команды процессору. Именно они и будут составлять машинный код программы.
|
|
Синтаксис ассемблера
По умолчанию, число в программе воспринимается ассемблером как десятичное. Чтобы обозначить двоичное число, необходимо к нему в конце добавить символ ’b’. Восьмеричное число обозначается аналогично с помощью символа ’o’. Для записи шестнадцатеричного числа эмулятор поддерживает 3 формы записи:
· перед числом записываются символы ’0x’ (как в C/C++);
· перед числом записывается символ ’$’ (как в Pascal);
· после числа записывается символ ’h’. Если шестнадцатеричное число начинается с буквы, необходимо добавить в начале ноль (иначе непонятно, число это или имя метки).
Процесс обработки программы на языке ассемблера
Весь процесс технического создания ассемблерной программы можно разбить на 4 шага (исключены этапы создания алгоритма, выбора структур данных и т.д.).
Набор программы в текстовом редакторе и сохранение ее в отдельном файле. Каждый файл имеет имя и тип, называемый иногда расширением. Тип в основном используется для определения назначения файла. Например, программа на C имеет тип C, на Pascal – PAS, на языке ассемблера – ASM.
|
|
Обработка текста программы транслятором. На этом этапе текст превращается в машинный код, называемый объектным. Кроме того, есть возможность получить листинг программы, содержащий кроме текста программы различную дополнительную информацию и таблицы, созданные транслятором. Тип объектного файла – OBJ, файла листинга – LST. Этот этап называется ТРАНСЛЯЦИЕЙ.
Обработка полученного объектного кода компоновщиком. Тут программа "привязывается" к конкретным условиям выполнения на ЭВМ. Полученный машинный код называется выполняемым. Кроме того, обычно получается карта загрузки программы в ОЗУ. Выполняемый файл имеет тип EXE, карта загрузки – MAP. Этот этап называется КОМПОНОВКОЙ или ЛИНКОВКОЙ.
Запуск программы. Если программа работает не совсем корректно, перед этим может присутствовать этап ОТЛАДКИ программы при помощи специальной программы – отладчика. При нахождении ошибки приходится проводить коррекцию программы, возвращаясь к шагу 1. Таким образом, процесс создания ассемблерной программы можно изобразить в виде следующей схемы. Конечной целью, напомним, является работоспособный выполняемый файл HELLO. EXE.
Программный эмулятор (виртуальный пк) Emu8086
|
|
Этот программный продукт содержит все необходимое для создания программы на языке Assembler.
Emu8086 сочетает в себе мощный редактор исходного кода, ассемблер, дизассемблер, программный эмулятор (виртуальный ПК) с отладчиком. Эмулятор выполняет программы на виртуальном ПК, который полностью исключает возможность доступа из вашей программы к реальным аппаратным средствам, таким как жесткие диски и память.
Машинный код 8086 полностью совместим со всеми последовавшими за ним поколениями микропроцессоров Intel, включая Pentium III и Pentium. Это делает код 8086 очень привлекательным, так как он выполняется как на старых, так и на современных компьютерных системах.
Пример 1.
Работа с эмулятором Emu8086. Особенности создания ассемблерной программы в среде эмулятора EMU8086
Emu8086 сочетает в себе мощный редактор исходного кода, ассемблер, дизассемблер, программный эмулятор (виртуальный ПК) с отладчиком и поэтапное обучение. Эта программа компилирует исходный код и выполняет его с помощью эмулятора шаг за шагом.
Итак, вы скачали и установили программу Emu8086 на свой компьютер. Запускаем её и создаём новый файл через меню FILE – NEW – COM TEMPLATE (Файл – Новый – Шаблон файла COM).
|
|
1. Запустите эмулятор и щелкните на кнопку new:
2. Выберите тип исполняемого файла:
В редакторе исходного кода после этого мы увидим следующее:
Рисунок 1 – Создание нового файла в Emu8086
Здесь надо отметить, что программы, создаваемые с помощью Ассемблеров для компьютеров под управлением Windows, бывают двух типов: COM и EXE. Отличия между этими файлами мы рассмотрим позже, а пока вам достаточно знать, что на первое время мы будем создавать исполняемые файлы с расширением COM, так как они более простые.
После создания файла в Emu8086 описанным выше способом в редакторе исходного кода вы увидите строку «add your code hear» – «добавьте ваш код здесь» (рисунок 1). Эту строку мы удаляем и вставляем вместо неё следующий текст:
MOV AH, 02h
MOV DL, 41h
INT 21h
INT 20h
Таким образом, полный текст программы будет выглядеть так:
ORG 100h
MOV AH, 02h
MOV DL, 41h
INT 21h
INT 20h
RET
Кроме этого в верхней части ещё имеются комментарии (на рисунке 1 – это текст зелёного цвета). Комментарий в языке Ассемблера начинается с символа ; (точка с запятой) и продолжается до конца строки.
Регистр символов в языке ассемблера роли не играет. Вы можете написать RET, ret или Ret – это будет одна и та же команда.
Напечатайте ваш код программы внутри текстовой области. Вы можете сохранить этот файл куда–нибудь на диск. Но можете и не сохранять.
Чтобы загрузить код в эмулятор, нажмите кнопку EMULATE (с зелёным треугольником) или клавишу F5. Откроется два окна: окно эмулятора и окно исходного кода (рисунок 2).
Рисунок 2 – Окно эмулятора Emu8086
В окне памяти (memory) перечисляют первую строку – смещение, вторая строка – значение hexadecimal, третья строка – десятичное значение, и последняя строка – значение символа ASCII (ОБВЕДЕНО РОЗОВЫМ ЦВЕТОМ на рисунке).
Кнопка [Single Step] выполняет команды, один за другим останавливающие после каждой команды.
[Run] кнопка выполняет команды один за другим с задержкой, установленной задержкой шага между командами.
Дважды щелкните на текстовых полях регистра, открывается окно "Extended Viewer " со значением того регистра, преобразованного ко всем возможным формам. Вы можете изменять значение регистра непосредственно в этом окне.
В окне эмулятора отображаются регистры и находятся кнопки управления программой.
В окне исходного кода отображается исходный текст вашей программы, где подсвечивается строка, которая выполняется в данный момент. Всё это очень удобно для изучения и отладки программ.
В окне эмулятора вы можете запустить вашу программу на выполнение целиком (кнопка RUN) либо в пошаговом режиме (кнопка SINGLE STEP). Пошаговый режим удобен для отладки.
Сейчас запустим программу на выполнение кнопкой RUN. После этого (если Вы не сделали ошибок в тексте программы) вы увидите сообщение о завершении программы (рисунок 3).
Здесь Вам сообщают о том, что программа передала управление операционной системе, то есть программа была успешно завершена. Нажмите кнопку ОК в этом окне и вы увидите, наконец, результат работы вашей первой программы на языке ассемблера (рисунок 4).
Рисунок 3 – Сообщение о завершении программы
Рисунок 4 – Ваша первая программа выполнена
Как мы уже говорили, наша первая программа выводит на экран английскую букву «А». Результат оправдал наши ожидания – буква «А» выведена на экран.
Здесь стоит отметить, что Emu8086 – это ЭМУЛЯТОР, то есть он эмулирует работу компьютера с процессором 8086. Поэтому в описанном выше примере программа выполняется не операционной системой, а эмулятором. Emu8086 может создавать и реальные программы, которые могут самостоятельно выполняться на компьютере.
Описание работы в эмулятора
В нашем случае пока не важно, как выполняется программа – эмулятором или операционной системой. Главное – разобраться с вопросом создания программ на языке ассемблера. Поэтому разберём нашу простенькую программку подробно.
#make_COM# – 1–ая строка. Эта команда – специфическая для Emu8086. Она используется для определения типа создаваемого файла. В нашем случае это файл с расширением .COM.
ORG 100h – 2–ая строка. Эта команда устанавливает значение программного счетчика в 100h, потому что при загрузке СОМ–файла в память, DOS выделяет под блок данных PSP первые 256 байт (десятичное число 256 равно шестнадцатеричному 100). Код программы располагается только после этого блока. Все программы, которые компилируются в файлы типа СОМ, должны начинаться с этой директивы.
MOV AH, 02h – 3–я строка. Инструкция (или команда) MOV помещает значение второго операнда в первый операнд. То есть значение 02h помещается в регистр АН. Для чего это делается? 02h – это ДОСовская функция, которая выводит символ на экран. Мы пишем программу для DOS, поэтому используем команды этой операционной системы (ОС). А записываем мы эту функцию (а точнее ее номер) именно в регистр АН, потому что прерывание 21h использует именно этот регистр.
MOV DL, 41h – 4–я строка. Код символа «A» заносится в регистр DL. Код символа «A» по стандарту ASCII – это 41h.
INT 21h – 5–я строка. Это и есть то самое прерывание 21h – команда, которая вызывает системную функцию DOS, заданную в регистре АН (в нашем примере это функция 02h). Команда INT 21h – основное средство взаимодействия программ с ОС.
INT 20h – 6–я строка. Это прерывание, которое сообщает операционной системе о выходе из программы и о передаче управления консольному приложению. Значит, при использовании INT 20h в нашем примере, управление будет передаваться программе Emu8086. А в том случае, если программа уже откомпилирована и запущена из ОС, то команда INT 20h вернет нас в ОС (например, в DOS). В принципе, в случае с Emu8086 эту команду можно было бы пропустить, так как эту же функцию выполняет команда RET, которая вставляется в исходный текст автоматически при создании нового файла по шаблону (как это сделали мы ранее). Но я решил использовать INT 20h и здесь для совместимости с другими ассемблерами.
Практическое задание:
1. Запустить эмулятор Emu8086
2. Изучить программные компоненты Emu8086 (основные окна, кнопки)
3. Выполнить пример, описанный пошагово в теоретическом разделе
4. Самостоятельно по образцу, рассмотренному выше, создать первую программу, которая будет выводить на экран: ‘Hello World’
5. Записать код выполненной программы, дать комментарии каждому выполняемому блоку команд
6. Изучить режимы работы отладчика
Контрольные вопросы:
1. Опишите структуру ассемблерной программы.
2. Опишите процесс обработки программы на языке ассемблера. Каковы этапы получения выполняемого файла?
3. Опишите назначение эмулятора Emu8086.
4. Опишите назначение основных компонентов Emu8086.
Дата добавления: 2021-07-19; просмотров: 1478; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!