Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
72
Добавлен:
16.04.2013
Размер:
249.25 Кб
Скачать

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

Следует иметь ввиду, что после вставки/удаления команд из отредактированной программы, необходимо соответствующим образом поменять адреса переходов, указываемых в командах.

Соседние файлы в папке Motorola - Описание лаб