Радиоавтоматика и МП / бр3995
.pdfМинистерство образования и науки Российской Федерации Сибирский федеральный университет
СХЕМОТЕХНИКА
МИКРОПРОЦЕССОРНЫЕ УСТРОЙСТВА В РАДИОЭЛЕКТРОННОМ ОБОРУДОВАНИИ
Учебно-методическое пособие для лабораторных работ
Электронное издание
Красноярск
СФУ
2012
1
УДК 621.396(07) ББК 32.844.15я73
С921
Составитель: Мичурина Маргарита Михайловна
С921 Схемотехника. Микропроцессорные устройства в радиоэлектронном оборудовании: учебно-методическое пособие для лабораторных работ [Электронный ресурс] / сост. М.М. Мичурина. – Электрон. дан. – Красноярск: Сиб. федер. ун-т, 2012. – Систем. требования: PC не ниже класса Pentium I; 128 Mb RAM; Windows 98/XP/7; Adobe Reader V8.0 и
выше. – Загл. с экрана.
Рассматривается система команд и основы разработки программного обеспечения на языке АССЕМБЛЕР.
Предназначено для студентов укрупнённой группы 160000 «Авиационная и ракетно-космическая техника» специальности 160905.65 «Техническая эксплуа- тация транспортного радиооборудования».
УДК 621.396(07) ББК 32.844.15я73
© Сибирский федеральный университет, 2012
Учебное издание
Подготовлено к публикации редакционно-издательским отделом БИК СФУ
Подписано в свет 18.10.2012 г. Заказ 9951. Тиражируется на машиночитаемых носителях.
Редакционно-издательский отдел Библиотечно-издательского комплекса Сибирского федерального университета 660041, г. Красноярск, пр. Свободный, 79
Тел/факс (391)206-21-49. E-mail rio@sfu-kras.ru http://rio.sfu-kras.ru
2
СОДЕРЖАНИЕ |
|
ВВЕДЕНИЕ .............................................................................................................. |
4 |
1. ЛАБОРАТОРНАЯ РАБОТА 1Знакомство с работой отладчика программ |
|
на ассемблере TURBO DEBUGGER..................................................................... |
4 |
1.1. Что такое ассемблер? ............................................................................. |
4 |
1.2. Алгоритм разработки программы на языке ассемблера .................... |
5 |
1.3. Основные составляющие программ ..................................................... |
9 |
1.4. Ассемблирование (трансляция) и компоновка программы ............. |
15 |
1.5. Отладка программы.............................................................................. |
17 |
1.6. Пример выполнения программы ....................................................... |
18 |
2. ЛАБОРАТОРНАЯ РАБОТА 2. Команды пересылок, логические команды, |
|
команды передачи управления............................................................................. |
20 |
3. ЛАБОРАТОРНАЯ РАБОТА 3. Изучение арифметических команд для |
|
выполнения операций двоичной арифметики .................................................... |
27 |
4. ЛАБОРАТОРНАЯ РАБОТА 4. Разработка и отладка программ, |
|
использующих арифметические операции над двоично-десятичными |
|
цифрами .................................................................................................................. |
31 |
5. ЛАБОРАТОРНАЯ РАБОТА 5. Разработка программ с использованием |
|
подпрограмм........................................................................................................... |
34 |
6. ЛАБОРАТОРНАЯ РАБОТА 6. Изучение цепочечных команды (команд |
|
обработки строк данных), команд организации циклов, команд сдвигов...... |
36 |
ЛИТЕРАТУРА И ИНФОРМАЦИОННЫЕ ИСТОЧНИКИ ............................... |
43 |
Основная литература................................................................................... |
43 |
Дополнительная литература....................................................................... |
43 |
Методическая литература........................................................................... |
43 |
ПРИЛОЖЕНИЯ ..................................................................................................... |
44 |
Приложение 1 .............................................................................................. |
44 |
Приложение 2 .............................................................................................. |
46 |
Приложение 3 .............................................................................................. |
46 |
Приложение 4............................................................................................. |
478 |
3
ВВЕДЕНИЕ
Для решения поставленной задачи программист может использовать любые высокоуровневые средства; кажется, что компьютер «понимает» языки высокого уровня, на самом деле программы исполняются на машинном языке, который и управляет процессором. Следовательно, программы должны предварительно переводиться в машинный код (компилироваться), при этом каждый оператор языков высокого уровня обычно преобразуется в целый набор машинных кодов. Только ассемблер может общаться с компьютером на его собственном языке и непосредственно управлять аппаратными средствами. По-настоящему решить проблемы, связанные с аппаратурой, невозможно без знания ассемблера. У каждого языка есть свои достоинства, но только на языке ассемблера обеспечивается максимальный доступ к процессору, что позволяет достичь высоких скоростей при выполнении программ, на нём можно писать более гибкие программы. И не случайно практически все компиляторы языков высокого уровня содержат средства связи своих модулей с модулями на ассемблере либо поддерживают выход на ассемблерный уровень программирования.
Фундаментом успешного освоения языка является знание принципов работы микропроцессора, организации микропроцессорных систем и принципов работы соответствующих контроллеров.
Изучив приведённый материал и выполнив лабораторные работы, мож- но получить основы программирования на ассемблере.
1. ЛАБОРАТОРНАЯ РАБОТА 1
Знакомство с работой отладчика программ на ассемблере
TURBO DEBUGGER
При выполнении лабораторной работы 1 необходимо изучить ниже приведённый материал, а также рекомендуется использовать следующую литературу из приведённого списка: [1], [4], [Л] и методические указания [1 – 4].
1.1. Что такое ассемблер?
Термин «ассемблер» имеет двоякий смысл. С одной стороны, его надо понимать как «Язык ассемблера», т. е. это специфический язык программиро- вания со взаимно однозначным соответствием между его операторами и ко- мандами процессора. Язык ассемблера существует для каждого типа процес-
4
соров или целого семейства процессоров. Это связано с тем, что команды на языке ассемблера должны иметь взаимно однозначное соответствие с систе- мой машинных команд и должны быть согласованы с архитектурой компью- тера. Язык ассемблера для процессоров Intel имеет систему команд, понимае- мую различными процессорами производства Intel, такими как 8086, 8088, 80186, 80286, 80386, 80486, Celeron и Pentium. С другой стороны , «Ассемб-
лер» – это программа, преобразовывающая исходные коды языка ассемблера в машинные команды. Ассемблер может создавать листинг программы с но- мерами строк, адресами памяти, исходными операторами и таблицей пере- крёстных ссылок символов и переменных, используемых в программе. Со- вместно используемая с ассемблером программа – загрузчик собирает от- дельные файлы, созданные ассемблером, в единую выполняемую программу. В блок базовых программ входит также отладчик, позволяющий программи- сту проверить и трассировать исполняемую программу и контролировать со- держимое памяти. Программы на языке ассемблера можно запускать либо в операционной системе MS-DOS, либо непосредственно в Windows. Наиболее популярные для семейства процессоров Intel ассемблеры MASM (Microsoft Assembler) и TASM (Borland Turbo Assembler). Язык ассемблера называется языком низкого уровня потому, что он очень близок к машинному языку по своей структуре и выполняемым функциям. Каждая команда ассемблера име- ет взаимно однозначное соответствие с машинными командами, что отличает его от языков высокого уровня, для которых характерно то, что один опера- тор транслируется во множество машинных команд. Микропроцессор пони- мает только машинные команды, которые он преобразовывает непосредст- венно в управляющие сигналы. Машинный язык для семейства Intel в своей основе имеет систему команд процессора 8086/88, которые могут выполнять- ся процессорами всех последующих модификаций. Такая концепция называ-
ется совместимостью сверху вниз.
1.2. Алгоритм разработки программы на языке ассемблера
Программа, написанная символическими мнемокодами, которые ис- пользуются в языке ассемблера, представляет собой исходный модуль, её форма в числовых кодах команд микропроцессора называется объектной программой, следующий этап – исполняемый модуль. Разработка программ на ассемблере начинается с разработки исходной программы. Работа с програм- мами на ассемблере требует внимания и аккуратности. При этом необходимо последовательно выполнить:
∙поставить задачу и составить проект программы, на этом этапе полезно составить блок-схему;
∙ввести команды программы в компьютер с помощью редактора;
5
∙оттранслировать программу с помощью ассемблера. Если ассемблер обнаружит ошибки, исправить их в редакторе и оттранслировать про- грамму заново;
∙преобразовать результат работы ассемблера в исполняемый модуль с помощью компоновщика;
∙выполнить программу;
∙проверить результаты. Если они не соответствуют ожидаемым, найти ошибки с помощью отладчика. Данный этап называется отладкой и обычно занимает большую часть времени, затрачиваемого на разработ- ку программы.
Для формирования исходного модуля применяют стандартные редакто- ры, работающие в ASCII кодах. Затем с помощью программы ассемблерного транслятора исходный текст транслируется в машинный код, т. е. в объект- ную программу. Таким образом, функцией программы-ассемблера является преобразование исходной программы, доступной восприятию человеком, в объектную программу, понятную человеку.
Операционная система может хранить программу в любом подходящем месте памяти и освобождает разработчика от необходимости думать, куда её поместить. Но чтобы этим воспользоваться, надо преобразовать оттранслиро- ванную программу в вид, позволяющий её перемещение. Такие программы называются перемещаемыми. Они создаются с помощью компоновщика – программы LINK, которая обязательно водит в комплект поставки ассембле- ра. Программа LINK определяет все адресные ссылки для объектной про- граммы, файл, содержащий перемещаемую версию оттранслированной про- граммы, называется исполняемым (загрузочным) модулем.
Компоновщик необходим также при написании большой программы. Невозможно написать сложную программу как единое целое, поэтому такие программы пишут по частям, которые потом можно собрать вместе с помо- щью компоновщика. При этом можно использовать модули, написанные дру- гими программистами, или ранее написанные и отлаженные модули.
Компоновщик должен вызываться для любой написанной программы, даже если она состоит только из одного объектного модуля. Одномодульные программы компоновщик сразу преобразует в перемещаемый модуль. Если программа состоит из двух или большего количества модулей, то компонов- щик сначала объединяет их, а затем преобразовывает результат в исполняе- мый модуль.
Отладка программы выполняется под управлением программы TURBO DEBUGGER. Наряду с другими функциями, TURBO DEBUGGER позволяет отображать и изменять значения переменных, останавливать выполнение программы в заданной точке или выполнять программу по шагам. Таким об- разом, TURBO DEBUGGER является основным инструментом для поиска и исправления ошибок в программе. Отладчик TURBO DEBUGGER – это про-
6
грамма, позволяющая отображать на экране значения необходимых перемен- ных, получать состояние всех регистров и ячеек памяти при пошаговом вы- полнении программы, вносить изменения в программу, указывать точки ос- танова и многое другое. Это необходимо при проверке написанных на языке ассемблера программ. Прежде чем более подробно остановиться на процессе отладки программ, рассмотрим некоторые
Всю информацию и данные Turbo Debugger отображает в меню (локальных и глобальных), блоках запроса (в которые информацию вводит пользователь) и в окнах. Используются различные виды окон в зависимости от того, какого типа информация в них отображается. Все окна открываются и закрываются с помощью команд меню (или активных клавиш, соответствующих этим командам). Большая часть окон отладчика Turbo Debugger вызывается из спускающегося меню View (просмотр). Из этого меню вызывается 14 видов окон. Имеется и окно другого типа, которое называется окном проверки (Inspect) и открывается выбором пункта Data|Inspect или пункта Inspect из большинства локальных меню.
Окна, вызываемые из меню: View
Breakpoints Stack
Log Watches Variables Module . . .
File . . .
CPU
Dump Registers
Numeric processor Execution history Hierarchy Another
Работа с отладчиком Turbo Debugger предполагает использование ак- тивных клавиш. Активная клавиша – это клавиша, нажатие которой заставля- ет отладчик выполнять определенное действие независимо от текущего со- стояния среды отладчика Turbo Debugger. На рис. 1 перечислены все актив- ные клавиши.
7
Клавиша |
Назначение |
F1 |
Получение контекстно-зависимой интерактивной подсказки |
F2 |
Устанавливает точку останова в позиции курсора |
F3 |
Список взятых модулей |
F4 |
Выполнение до позиции курсора |
F5 |
Наезд / отъезд для текущего окна |
F6 |
Переход к следующему окну |
F7 |
Выполнение одной исходной строки или команды |
F8 |
Выполнение одной исходной строки или команды с про- |
|
пуском вызовов |
F9 |
Запуск программы |
F10 |
Вызов линейки меню, выход из меню |
Alt-F1 |
Возврат к прошлому экрану подсказки |
Alt-F2 |
Устанавливает точку останова по адресу |
Alt-F3 |
Закрывает текущее окно |
Alt-F4 |
Реверсирует выполнение программы |
Alt-F5 |
Показывает экран вывода программы |
Alt-F6 |
Открывает последнее закрытое окно |
Alt-F7 |
Выполняет одну команду программы Trace |
Alt-F8 |
Выполняет программу до возврата из функции |
Alt-F9 |
Выполняет программу до заданного адреса |
Alt-F10 |
Вызывает локальное меню окна |
Alt-1-9 |
Делает активным окно с заданным номером |
Alt-пробел |
Вызывает меню System |
Alt-B |
Вызывает меню Breakpoints |
Alt-D |
Вызывает меню Data |
Alt-F |
Вызывает меню File |
Alt-H |
Вызывает меню Help |
Alt-O |
Вызывает меню Options |
Alt-R |
Вызывает меню Run |
Alt-V |
Вызывает меню View |
Alt-W |
Вызывает меню Window |
Alt-X |
Осуществляет выход из отладчика и возврат в DOS |
Ctrl-F2 |
Завершает сеанс отладки и устанавливает программу в ис- |
|
ходное состояние |
Ctrl-F4 |
Вычисляет значение выражения |
Ctrl-F5 |
Инициирует перемещение или изменение размера окна |
Ctrl-F7 |
Заносит переменную в окно слежения |
Ctrl-F8 |
Переключает точку останова в текущей позиции курсора |
Ctrl-F9 |
Запускает программу |
Ctrl-F10 |
Вызывает локальное меню окна |
|
8 |
Ctrl-Стрелка вправо |
Смещает начальный адрес в подокне кода, |
данных |
|
|
или стека окна процессора на 1 байт вверх |
|
|
Ctrl-Стрелка влево |
Смещает начальный адрес в подокне кода, |
данных |
|
|
или стека окна процессора на 1 байт вниз |
|
|
Ctrl-A |
Перемещение к предыдущему слову |
|
|
Ctrl-G |
Осуществляется ввод ячейки памяти, данные которой необ- |
||
|
ходимо посмотреть, например Ctrl-G DS:SI |
|
|
Ctrl-C |
Скроллинг на один экран вниз |
|
|
Ctrl-D |
В окне данных позволяет преобразовать данные в любой из |
форматов, например,
DOUBLE восьми байтовый вещественный формат
Рис.1. Активные клавиши Turbo Debugger
1.3. Основные составляющие программ
Любая программа должна обязательно состоять из сегментов. Обычно в программе задаются три сегмента: команд, данных и стека, а при необходимости организуют дополнительный сегмент. Сегменты могут быть самостоятельными блоками памяти или объединяться. В табл. 1 приведены наиболее используемые модели памяти.
Большинство программ на языке ассемблера можно разделить на пять основных частей со следующими условными названиями: заголовок,
макроопределения, данные, тело программы и заключение.
Заголовок. Любая программа начинается с заголовка. В нём содержатся команды и директивы, которые не приводят к созданию машинного кода при трансляции, но помогают при генерации исполняемого файла.
На рис. 2 представлен один из вариантов типичного заголовка ассемблерной программы.
TITLE «Программа инвертирования строки»
MODEL small STASK 256
Рис. 2. Типичный заголовок ассемблерной программы
Первая строка описывает назначение программы, сообщение, находящийся в кавычках, будет располагаться в начале каждой страницы исходного текста. Далее следует директива MODEL, выбирающая одну из нескольких моделей памяти.
9
|
|
|
Таблица 1 |
Название |
Код |
Данные |
Описание |
|
|
|
|
Tiny |
Near |
Near |
Код, данные и стек содержатся в одном сегменте |
|
|
|
64 Кбайт. Используется только для COM- |
|
|
|
программ |
|
|
|
|
Small |
Near |
Near |
Код и данные содержатся в различных сегментах |
|
|
|
размером до 64 Кбайт. Используется для не- |
|
|
|
больших и средних EXE-программ. Подходит |
|
|
|
для большинства чисто ассемблерных программ |
|
|
|
|
Medium |
Far |
Near |
Неограниченный размер кода. Под данные отво- |
|
|
|
дится один сегмент 64 Кбайт. Используется для |
|
|
|
написания больших программ с небольшим объ- |
|
|
|
ёмом данных |
Large |
Far |
|
Размер кода и данных неограничен. Использует- |
|
|
|
ся в больших программах. Размер переменной не |
|
|
|
может превышать 64 Кбайт |
|
|
|
|
Huge |
Far |
Far |
Размер кода и данных неограничен. Аналогична |
|
|
|
большой модели памяти. (Введена для совмести- |
|
|
|
мости с языками высокого уровня) |
Tchuge |
Far |
Far |
Совпадает с большой моделью памяти, но по- |
|
|
|
другому определяет регистры. В основном ис- |
|
|
|
пользуется при программировании на языках |
|
|
|
TURBO C и BORLAND C ++ |
|
|
|
|
Tpascal |
Near |
Far |
Обеспечивает поддержку ранних версий TURBO |
|
|
|
PASCAL. B BORLAND PASCAL не применяется |
|
|
|
|
Fiat |
Near |
Far |
Используется в среде OS/2, в остальном анало- |
|
|
|
гична малой модели памяти |
|
|
|
|
Чаще всего при программировании на языке ассемблера пользуются мо- делью памяти типа small (малая). Несмотря на такое название, малая модель выделяет 64 Кбайт под исполняемый код и 64 Кбайт под данные, что практи- чески удовлетворяет потребности самых больших ассемблерных программ.
Директива STASK резервирует пространство для стека программы, в при- ведённом примере (рис.1) зарезервировано 256 байт. В основном программы используют небольшой стек, даже самые большие редко требуют более 8 Кбайт.
Макроопределения. После заголовка следуют различные описания пе- ременных и констант. Для описания пользуются некоторыми директивами (псевдооператорами). Директивы управляют работой программы-ассемблера, а не микропроцессора. (В приложении 1 приведены наиболее часто исполь- зуемые директивы). С помощью директив можно определять сегменты и под- программы (процедуры), давать имена командам и данным, резервировать области памяти и выполнять другие важные задачи. В отличие от команд языка ассемблера большинство директив не генерирует объектный код. В ас- семблере константы часто называют макроопределениями, использующими директиву EQU, которая связывает значение с определённым именем (иден- тификатором), вместо которого Turbo Assembler подставит указанное значе-
10