
- •Лабораторная работа n1. Изучение программно-аппаратных средств разработки и отладки систем на базе mc68000. Введение
- •Теоретическая часть
- •1. Программная модель мп мс68000
- •1.1 Внутренние регистры
- •Регистры данных Dn
- •Регистры адреса
- •Программный счетчик рс (Program Counter)
- •Регистр состояния sr (Status Register)
- •1.2. Форматы данных и размещение данных в памяти Форматы данных
- •Форматы команд
- •2. Структура и возможности учебного одноплатного компьютера sbc68k
- •Структура организации памяти модуля sbc68k
- •Каналы последовательного обмена.
- •Порты параллельного ввода/вывода.
- •Программируемые таймеры/счетчики.
- •Контроллер дисковода.
- •3. Встроенный монитор (отладчик)
- •Инициализация системы.
- •Символы управления терминалом.
- •Формат командной строки.
- •Выражение в качестве параметра.
- •Адрес в качестве параметра.
- •Сообщения монитора при выполнении команд.
- •Система команд монитора
- •Заполнение блока памяти (Block of memory Fill)
- •Перемещение блока (Block Move)
- •Ввод точек останова (bReakpoint)
- •Поиск ячеек памяти (Block of memory Search)
- •Преобразование данных (Data Conversion)
- •Отображение состояния регистров процессора.
- •Выполнение программы в реальном времени (go)
- •Непосредственное выполнение программы.
- •Выполнение программы до точки останова (Go unTil breakpoint)
- •Вывод справочной информации (hElp)
- •Загрузка программы в память модуля (lOad)
- •Отображение содержимого памяти (Memory Display)
- •Изменение содержимого памяти (Memory Modify)
- •Запись блока данных в память (Memory Set)
- •Удаление точек останова (nobReakpoint)
- •Отображение/изменение содержимого определенного регистра.
- •"Прозрачный" режим работы последовательных портов (Transparent Mode)
- •Трассировка (tRace)
- •Трассировка до текущей точки останова (Trace to Temporary breakpint)
- •3. Встроенный ассемблер/реассемблер.
- •Язык ассемблера mc68000.
- •Мнемонические обозначения и специальные символы
- •Список символов
- •Директива определения константы dc.W (Define Constant.Word)
- •4. Работа с сервером
- •Запуск и работа ассемблера.
- •Кросс-ассемблер. Формат записи программы.
- •Поле метки
- •Операторы в выражениях.
- •Определение методов адресации.
- •Особенности записи в ассемблере некоторых команд Команды переходов.
- •Команда movem.
- •Команды быстрых вычислений (moveq, addq, subq).
- •Директивы ассемблера. Org Установка начального адреса.
- •Equ Определение имени.
- •Set Установка имени.
- •Reg Определение набора регистров.
- •Dc Определение константы.
- •44 43 20 45 78 61 6D 70 6c 65 0d 0a 00 (в шестнадцатиричном виде). Dbc Определение блока констант.
- •Ds Резервирование памяти.
- •End Конец транслируемого файла.
- •Формат s-Record
- •Содержимое записи s-record.
- •Типы записей s-record.
- •Практическая часть
- •1. Ввод исходных данных и анализ результатов работы программы с помощью команд просмотра и модификации памяти и регистров.
- •2. Ввод программы с помощью встроенного ассемблера
- •3. Режимы выполнения программы
- •4. Подготовка, ассемблирование и загрузка программы с помощью программных средств сервера.
2. Ввод программы с помощью встроенного ассемблера
Программа пользователя может быть введена в память при помощи встроенного ассемблера монитора TUTOR. Вызов работы ассемблера производится директивой MM <адрес>;DI , где параметр <адрес> определяет ячейку памяти, с которой начнется ввод программы. После запуска директивы производится дизассемблирование команды, начинающейся с указанного в директиве адреса, и вывод ее машинных кодов и мнемоники с операндами в следующей строке. В конце строки указывается знак "?" после которого пользователь может ввести новую команду. После ввода новой команды (RETURN) ее мнемоническое обзначение переводится в соответствующие машинные коды, которые записываются в память, начиная с указанного адреса, после этого ассемблер переписывает предыдущую строку, но уже с новой командой, и дизассемблирует следующую. Так продолжается до ввода на очередной запрос точки, после чего работа директивы заканчивается. Если пользователь не хочет модифицировать очередную команду, то после знака "?" следующего за ней, следут ввести RETURN, после чего данная команда останется в памяти и произойдет переход к редактированию следующей. На ошибки, при вводе команды, ассемблер реагирует выводом в новой строке сообщения: "X?", после которого пользователь может повторить ввод команды или завершить работу директивы. Следует иметь ввиду, что при вводе новой команды ее мнемоника должна отделятся от знака "?" и операндов по крайней мере одним пробелом.
Для примера рассмотрим ввод в память простой программы. В результате работы этой программы производится заполнение восьми последовательно расположенных байтов памяти, начиная с адреса, который записывается в регистр A0 перед выполнением программы, последовательностью чисел, где каждое следующее число на единицу больше предыдущего. Заполнение начинается с числа, находящегося в регистре D0 перед выполнением программы. Один из вариантов программы выглядит следующим образом:
1000: MOVE.W #7,D1 ;запись в счетчик D1 количества выводимых чисел (уменьшенного на 1)
J1: MOVE.B D0,(A0)+ ;запись числа из регистра D0 по адресу, находящемуся в регистре A0, с увеличением содержимого A0 на 1
ADD.B #1,D0 ;увеличение содержимого D0 на 1
DBF.L D1,J1 ;уменьшение значения счетчика D1 на 1 и проверка: если D1=-1, то переход к следующей команде, иначе переход на метку J1
J2: BRA.S J2 ;конец программы: бесконечный цикл
Ассемблер монитора TUTOR не позволяет использовать метки, поэтому при первоначальной записи программы в память рекомендуется вместо адресных меток в указывать в поле операндов символ "*", который на языке ассемблера означает адрес начала текущей команды. При повторном редактировании текста, звездочка заменяется на необходимый адрес.
Для записи программы введем директиву:
TUTOR 1.32> MM 1000;DI
В следующей строке появится сообщение:
001000 FFFF DC.W $FFFF ?
После него введем первую команду программы:
001000 FFFF DC.W $FFFF ? MOVE.W #7,D1
После записи команды (клавиша RETURN) информация на дисплее примет следующий вид:
TUTOR 1.32> MM 1000;DI
001000 323C0007 MOVE.W #7,D1
001004 EEEE DC.W $EEEE ?
Продолжим процесс записи программы аналогичным образом, заменяя адресные метки в полях операндов на символы "*". После ввода последней команды, введенная информация будет присутствовать на дисплее в следующем виде:
TUTOR 1.32> MM 1000;DI
001000 323C0007 MOVE.W #7,D1
001004 10C0 MOVE.B D0,(A0)+
001006 06000001 ADD.B #1,D0
00100A 51C9FFFE DBF.L D1,*
00100E 60FE BRA.S *
001010 FFFF DC.W $FFFF ?
Завершить ввод программы следует вводом точки после знака "?" в последней строке и нажатием клавиши RETURN, после этого произойдет выход в монитор. Поскольку после ввода программы нам стали известны адреса используемых меток, мы можем отредактировать текст соответствующем образом: в команде DBEQ.L D1,J1 используется переход на метку J1, как видно из листинга введенной программы, метка J1 имеет адрес $1004, выведем данную команду для редактирования:
TUTOR 1.32> MM 100A;DI
00100A 51C9FFFE DBF.L D1,$00100A ?
Введем на место прежней команды новую, с корректным адресом:
TUTOR 1.32> MM 100A;DI
00100A 51C9FFFE DBF.L D1,$00100A ? DBEQ.L D1,$1004
Адрес в последней команде можно не редактировать, поскольку адрес перехода в ней совпадает адресом самой команды и переход, обозначенный звездочкой, является корректным.
Для того, чтобы вывести на дисплей полный листинг программы следует воспользоваться директивой MD <адрес> [<количество>];DI , которая дизассемблирует группу машинных кодов с числом байт, указанных в параметре <количество> начиная с ячейки памяти определенной параметром <адрес>. Если параметр <количество> не указывается, то дизассемблируется одна команда. Для вывода листинга программы введем директиву:
TUTOR 1.32> MD 1000 F;DI
После этого на дисплее появится текст программы:
TUTOR 1.32> MD 1000 F;DI
001000 323C0007 MOVE.W #7,D1
001004 10C0 MOVE.B D0,(A0)+
001006 06000001 ADD.B #1,D0
00100A 51C9FFFE DBF.L D1,$001004
00100E 60FE BRA.S $00100E
TUTOR 1.32>
При редактировании программы может понадобиться вставить в текст одну или несколько новых команд или удалить одну или несколько старых. Для этого можно воспользоваться директивой монитора BM, которая позволяет копировать группу последовательно лежащих данных из одной области памяти в другую. Например, для того, чтобы вставить команду MOVE.B D0,(A1)+ после команды MOVE.B D0,(A0)+ в нашей программе, можно сделать следующее:
Выполнив директиву
TUTOR 1.32> BM 1006 100F 1010
переместить три последних команды в свободную область памяти (в данном случае начиная с адреса $1010). Записать после команды MOVE.B D0,(A0)+ новую:
TUTOR 1.32> MM 1006;DI
001006 06000001 ADD.B #1,D0 ? MOVE.B D0,(A1)+
001006 12C0 MOVE.B D0,(A1)+
001008 0001 DC.W $0001 ?.
Остается поместить три последних команды после вновь введенной:
TUTOR 1.32> BM 1010 1019 1008
Удалить эту команду можно следующей директивой:
TUTOR 1.32> BM 1008 1011 1006
Следует иметь ввиду, что после вставки/удаления команд из отредактированной программы, необходимо соответствующим образом поменять адреса переходов, указываемых в командах.