Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
проги для экзамена.doc
Скачиваний:
0
Добавлен:
23.12.2018
Размер:
127.49 Кб
Скачать

2. Типовые задачи программирования

Программирование МК весьма разнообразно вследствие крайне широкого использования МК для управления. Однако почти всегда конкретная программа может быть разбита на ряд типовых задач, для которых уже известно, по крайней мере, теоретическое решение. Поэтому ниже приводятся фрагменты таких типовых программ. Естественно, что решать эти задачи можно различными способами и здесь приводится только один из них.

2.1. Арифметические и логические операции

Система команд содержит следующие арифметические и логические операции:

ADD - сложение двух операндов, один из которых в А, и помещение результата а А,

ADDС - сложение двух операндов, один из которых в А, с учетом ранее сформированного бита переноса С, и помещение результата а А. В основном используется для сложения старших байт для многобайтных операндов.

SUBB - вычитание двух чисел с учетом переноса.

ANL - операция "логическое И" операнда в А с маской. Побитная операция. В результате обнуляются те биты числа, в которых в маске был 0. Остальные биты не меняются. Результат - в А.

ORL - операция "логическое ИЛИ" операнда в А с маской. Побитная операция. В результате устанавливаются в 1 те биты числа, в которых в маске была 1. Остальные биты не меняются. Результат - в А.

XRL - операция "ИСКЛЮЧАЮЩЕЕ ИЛИ" операнда в А с маской. Побитная операция. В результате устанавливаются в 1 те биты числа, в которых в маске и в числе были разные биты, и устанавливаются в 0 те биты числа, в которых в маске и в числе были одинаковые биты.

2.1.1. Сложить содержимое ячейки внутренней памяти oper1 и регистра r0, сумму поместить в ячейку внутренней памяти sum.

Распределение ресурсов: можно использовать прямую адресацию ячеек в операциях суммирования и пересылки. Для суммирования задействован регистр А.

Name SUM

Beg: mov a,OPER1 ; перекопирование первого операнда в А

add a,R0 ; операция суммирования с R0, результат обратно в А

mov SUM,a ; перекопирование результата в ячейку SUM

END

2.1.2. Сложить содержимое регистра r0 и регистра r1, сумму поместить в ячейку внутренней памяти sum.

Распределение ресурсов: можно использовать прямую адресацию ячеек в операциях суммирования и пересылки. Для суммирования задействован регистр А.

Name SUM1

Beg: mov a,R0 ; перекопирование первого операнда в А

Add a,R1 ; операция суммирования с R0, результат обратно в А

mov SUM,a ; перекопирование результата в ячейку SUM

END

2.1.3. Вычесть из содержимого ячейки First внешней памяти данных содержимое внутренней ячейки с адресом 35н, результат поместить во вторую ячейку внешней памяти Second.

Распределение ресурсов: Так как в операции участвуют ячейки внешней памяти данных, то доступ к ним осуществляется только косвенно с использованием указателя данных DPTR. Для разнообразия используем также косвенную адресацию для внутренней ячейки, где в качестве указателя будет выступать регистр R0.

Name SUBTR

beg: mov dptr, #First ;загрузка в указатель адреса первой ячейки с операндом

mov R0, #35h ;загрузка в R0 адреса второй ячейки с операндом

movx a, @dptr ;пересылка первого операнда в А

subb a,@R0 ;вычитание из первого операнда (в А) второго операнда (в ячейке с адресом в R0)

mov dptr, #Second ;загрузка в указатель адреса ячейки, куда надо сохранить результат

movx @dptr,a ;пересылка результата в ячейку

END

Команда Операция Что оценивается

JZ rel переход, если A=0 только А

JNZ rel переход, если A??0 только А

DJNZ <byte>, rel декремент и переход, если не нуль

CJNE A, <byte>, rel переход, если A??<byte>

CJNE <byte>#data,rel переход, если <byte>?? #data

JC rel переход, если C=1

JNC rel переход, если C=0

JB bit, rel переход, если bit=1

JNB bit, rel переход, если bit=0

JBC bit, rel переход, если bit=1; очистка этого бита

Все условные переходы определяют адрес назначения как относительное смещение (rel) с длиной перехода, находящейся в пределах от -128 до +127 байт (относительно инструкции, следующей за условным переходом).

В PSW отсутствует флаг нуля, поэтому инструкции JZ и JNZ проверяют условие "равен нулю" тестированием данных в аккумуляторе.

Инструкция DJNZ (Decrement and Jump if Not Zero) используется для организации циклов.

Инструкция CJNE (Compare and Jump Not Equal) также может использоваться для управления циклами. Другим применением данной инструкции является проверка условий "больше чем", "меньше чем". Два байта в поле операндов представлены как "беззнаковое целое". Если первый операнд меньше, чем второй, то бит переноса "С" устанавливается в "1"; если больше или равен, то флаг "С" очищается.