Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы / Lab_moto / 1.doc
Скачиваний:
16
Добавлен:
16.04.2013
Размер:
211.97 Кб
Скачать

Регистры нс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

>

После ввода программы можно еще раз просмотреть ее листинг, для чего необходимо снова выполнить команду ASM100 и вводить (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 (команда условного перехода на начало цикла или выход) командой BR10B. Продолжите выполнение программы командой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.

Соседние файлы в папке Lab_moto