Работа с эмулятором Emu8086. Особенности создания ассемблерной программы в среде эмулятора EMU8086

Практическая работа №10

Изучение интерфейса учебной микроЭВМ, программной модели эмулятора универсального однокристального микропроцессора

Цель: Изучение принципов построения и работы программной модели эмулятора универсально однокристального микропроцессора

 

Порядок выполнения

  1. Изучить теоретическую часть
  2. Выполнить практический пример
  3. Реализовать полученный алгоритм на языке Ассемблера
  4. Выполнить тестирование программы
  5. Ответить на контрольные вопросы
  6. Оформить отчет по проделанной работе

 

Теоретическая часть

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; Мы поможем в написании вашей работы!

Поделиться с друзьями:




Мы поможем в написании ваших работ!