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

Регистры нс05.

В качестве операндов в командах асемблера могут использоваться два внутренних регистра НС05:

a- 8-битный aккумулятор;

x- 8-битный индексный регистр.

Определение методов адресации.

Формат различных типов адресации:

# данные- непосредственная адресация;

*адрес - прямая адресация (0<=адрес<=255);

,x- индексная адресация без смещения;

смещение,x- индексная адресация со смещением ;

адрес- расширенная адресация;

метка- относительная адресация.

Практическая часть.

Во всех последующих лабораторных работах настоящего практикума Вам будет необходимо выполнить стандартную последовательность действий:

· ввод программы в память ОМ;

· ввод исходных данных перед выполнением программы;

· выполнение программы;

· анализ результатов работы программы.

Рассмотрим подробно выполнение указанных операций с использованием команд отладчика EVM-bug на примере простейшей программы, суммирующей содержимое регистра А и ячеек памяти с адресами $50 - $5F, с занесением результата в ячейку памяти с адресом $60.

Исходный текст программы представлен ниже.

Примечание. Система команд НС05 подробно изучается в двух следующих лабораторных работах. Данный пример приведен исключительно для демонстрации возможностей ОМ по вводу и выполнению программ, поэтому приведенная в комментариях информация о работе команд является достаточной на данном этапе.

STA $60 запись регистра А в ячейку $0060

LDX #10 запись в регистр Х количества складываемых ячеек

L1: LDA $4F,X извлечение содержимого очередной ячейки

($005F, $005E, ... $0050)

ADD $60 сложение с содержимым ячейки $0060

STA $60 запись результата в ячейку $0060

DEX уменьшение счетчика количества ячеек на 1

BNE L1 переход на L1, если счетчик равен нулю

NOP команда "нет операции"

Примечание. В приведенных ниже примерах жирным шрифтом выделены команды, выводимые ОМ, информация, которую требуется вводить пользователю, не выделена.

Для ввода программы в память ОМ средствами встроенного отладчика используется команда ASM. Начнем запись программы в псевдо-ПЗУ ОМ с адреса $0100 (возможно расположение программы в другом месте псевдо-ПЗУ или в ОЗУ кроме области стека, см. карту памяти в теоретической части):

>ASM 100 ассемблирование с адреса $01005

0100 00 00 00 BRSET 0,$00,$0103 >STA $60 ввод команды STA

0100 B7 60 STA $60

После ввода первой строки необходимо сделать некоторые пояснения. Рассмотрите рис. 5, на котором поясняется выводимая на монитор командой ASM информация.

Рис. 5. Результат выполнения команды ASM.

Замечание: ниже будет показано, что мнемоника введенной команды может не совпадать с мнемоникой вводимой команды.

Продолжим ввод программы:

0102 00 00 00 BRSET 0,$00,$0105 >LDX #10

0102 AE 10 LDX #$10

0104 00 00 00 BRSET 0,$00,$0107 >LDA 4F,X

0104 E6 4F LDA $4F,X

0106 00 00 00 BRSET 0,$00,$0109 >ADD 60

0106 BB 60 ADD $60

0108 00 00 00 BRSET 0,$00,$010B >STA 60

0108 B7 60 STA $60

010A 00 00 00 BRSET 0,$00,$010D >DEX мнемоника введенной команды

010A 5A DECX не совпадает со вводимой

010B 00 00 00 BRSET 0,$00,$010E >BNE 104

010B 26 F7 BNE $0104

010D 00 00 00 BRSET 0,$00,$0110 >NOP.

010D 9D NOP

>

После ввода программы можно еще раз просмотреть ее листинг, для чего необходимо снова выполнить команду ASM 100 и вводить (RETURN) после каждой команды:

>ASM 100

0100 B7 60 STA $60 >

0102 AE 10 LDX #$10 >

0104 E6 4F LDA $4F,X >

0106 BB 60 ADD $60 >

0108 B7 60 STA $60 >

0109 5A DECX >

010B 26 F7 BNE $0104 >

010D 9D NOP >.

>

Перед выполнением программы необходимо ввести в регистр А и в ячейки памяти исходные данные. Предположим, что значение А перед выполнением программы должно быть равно $00.

Для изменения содержимого регистров используется команда RM:

>RM команда модификации регистров

S=FF регистр SP не может быть изменен

Р=0100>$0100 записываем в программный счетчик адрес начала программы

A=31>0 записываем в аккумулятор исходные данные

X=FF>

C=E8>. завершение команды изменения регистров точкой

>

После ввода исходных данных в регистры можно просмотреть их новое содержимое с помощью команды RD:

>RD

Regs

S=FF P=0100 A=00 X=73 C=E8 111.I...

Ниже приведено пояснение к выдаваемому сообщению:

Для изменения содержимого памяти используется команда ММ. Предположим, что нам необходимо записать в ячейки $50 - $5F следующую исходную информацию:

0050 01 02 03 04 05 06 07 08 09 09 09 09 09 09 09 09

Производим запись (выход из режима модификации памяти также осуществляется вводом точки):

>MM 50

0050=00>01

0051=00>02

0052=00>03

0053=00>04

0054=00>05

0055=00>06

0056=00>07

0057=00>08

Поскольку содержимое ячеек $0058 - $005F должно быть одинаковым, то можно воспользоваться командой заполнения области памяти BF:

>BF 58 5F 09 заполнение ячеек 58 ... 5F кодом 09

Для проверки правильности ввода исходной информации в память введите команду отображения памяти MD:

>MD 50

0050 01 02 03 04 05 06 07 08 09 09 09 09 09 09 09 09 . . . . . . . . . . . . . . . .

Обратите внимание, что если указан только начальный адрес, то выводится 16 байт. Для просмотра большего количества ячеек можно использовать конечный адрес, например:

>MD 50 61

0050 01 02 03 04 05 06 07 08 09 09 09 09 09 09 09 09 . . . . . . . . . . . . . . . .

0060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . . . . . . . . . . . . . . . .

После того как введены исходные данные, можно переходить к выполнению программы. Возможны следующие режимы выполнения программы:

Режим трассировки.

Данный режим позволяет выполнять несколько команд программы, число которых задается в качестве параметра команды Т. Если этот параметр отсутствует, выполняется одна команда. Выполнение начинается с текущего адреса, записанного в регистре РС. После выполнения каждой команды на экран выводится строка, которая будет выполняться следующей, и содержимое регистров, аналогично команде RD.

Выполним первую команду нашей программы командой Т (программный счетчик уже установлен на начало программы ранее командой RM):

>T

0102 AE 10 LDX #$10

S=FF P=0102 A=00 X=73 C=ЕA 111.I.Z.

>

Для того, чтобы выполнить следующие 5 команд, необходимо выполнить директиву Т в следующем виде:

>Т 5

0104 E6 4F LDA $4F,X

S=FF P=0104 A=00 X=10 C=Е8 111.I...

0106 BB 60 ADD $60

S=FF P=0106 A=09 X=10 C=Е8 111.I...

0108 B7 60 STA $60

S=FF P=0108 A=09 X=10 C=Е8 111.I...

010A 5A DECX

S=FF P=010A A=09 X=10 C=Е8 111.I...

010B 26 F7 BNE $0104

S=FF P=010B A=09 X=0F C=Е8 111.I...

>

Обратите внимание, что флаг нуля (Z) перед следующей командой не установлен. Выполним команду условного перехода (BNE), которая осуществляет переход на адрес 0104, если флаг Z не установлен (продолжение цикла), или переходит к следующей по порядку команде, если флаг Z установлен (выход из цикла):

>T

0104 E6 4F LDA $4F,X

S=FF P=0104 A=09 X=0F C=Е8 111.I...

>

Убедитесь, что произошел переход на адрес $0104 (содержимое программного счетчика РС стало равным 0104).

Продолжим выполнение программы с использованием директивы G (выполнение до точки останова). Этот режим также часто применяют при отладке программ. Поставим точку останова на адрес $010B (команда условного перехода на начало цикла или выход) командой BR 10B. Продолжите выполнение программы командой G:

>G

При выполнении очередного цикла программа встречает точку останова и на экран выдается сообщение:

Brkpt

S=FF P=010B A=12 X=0E C=F8 111HI...

Обратите внимание, что условие выхода из цикла по-прежнему не выполнено (флаг Z не установлен). На приведенном примере удобно проиллюстрировать очень полезный режим выполнения программы - выполнение с игнорированием точки останова определенное количество раз (директива Proceed). Предположим, что нам необходимо произвести останов перед выполнением все той же команды условного перехода, но в тот момент, когда выполнено условие выхода из цикла. Поскольку счетчик цикла (в качестве которого в нашем примере использовался регистр Х) изначально содержал число 16 и два раза уменьшался на 1 по мере прохождения цикла, то, очевидно, он станет равен нулю, если выполнить цикл еще 14 раз, при этом установится флаг нулевого результата Z и, соответственно, будет выполнено условие выхода из цикла. Для того, чтобы отменить текущую точку останова на 14 шагов, следует использовать команду Р E. Выполните команду:

>P E

Brkpt

S=FF P=010B A=6C X=00 C=ЕA 111.I.Z.

>

Заметьте, что регистр Х обнулен, а в регистре ССR установлен флаг Z. Проверим правильность выполнения команды выхода из цикла, для чего выполним ее директивой T (перед этим необходимо удалить с команды условного перехода точку останова, так как в противном случае она не будет выполняться).

Отмените точку останова командой NOBR 10B:

>NOBR 10B

Brkpts=

Теперь выполните команду условного перехода директивой T и убедитесь, что управление передается следующей команде:

>T

010D 9D NOP

S=FF P=010D A=6C X=00 C=ЕA 111.I.Z.

Проверьте результат работы программы, для чего выполните команды MD 50 60, RD:

>MD 50 60

0050 01 02 03 04 05 06 07 08 09 09 09 09 09 09 09 09 . . . . . . . . . . . . . . . .

0060 6C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 l . . . . . . . . . . . . . . .

>RD

Regs

S=FF P=010D A=6C X=00 C=EA 111.I.Z.

Нетрудно заметить, что сумма содержимого ячеек $0050 - $005F и аккумулятора действительно равна $6C.

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