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

Лабораторная работа №4 / Laboratornaya_rabota_4N

.docx
Скачиваний:
8
Добавлен:
21.06.2022
Размер:
332.13 Кб
Скачать

МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИ РОССИЙСКОЙ ФЕДЕРАЦИИ

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ

«МОСКОВСКИЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»

(МОСКОВСКИЙ ПОЛИТЕХ)

Факультет машиностроения

Кафедра «Автоматика и управление»

Лабораторная работа №4

По дисциплине «Проектирование микропроцессорных систем управления»

Группа

204-251

Студенты

Сагитова Н.С.

Преподаватель

Палагута К.А.

Москва 2021

Лабораторная работа №4. Микроконтроллер MC68HC908GP32: команды управления программой и процессором.

Цель работы: изучение команд управления программой и процессором.

Теоретическое введение

Для управления выполнением программы используются команды безусловного перехода JMP, условных и безусловных ветвлений Bcc, BRCLR, BRSET, BRA, BRN, сравнения с переходом по результату сравнения CBEQ, CBEQA, CBEQX, перехода и ветвления к подпрограмме JSR, BSR, возврата из подпрограммы RTS, организации циклов DBNZ, DBNZA, DBNZX, программного прерывания SWI, возврата из прерывания RTI.

Команда BRA (обязательное ветвление) осуществляет безусловное ветвление.

Команды условного ветвления Bcc производят загрузку в PC нового адреса, если выполняется определенное условие. В табл.1 приведены 18 видов условий, которые вызывают ветвление программы. Мнемокод условия сс приписывается к букве B, образуя мнемокод соответствующей команды условного ветвления. Например, B + PL = BPL - мнемокод команды ветвления при положительном результате предыдущей операции (признак N=0).

Таблица 1. Используемые в программе команды управления программой и процессором.

Мнемокод

Команда

Операция

JMP (opr)

Безусловный переход

EA  PC

BRA rel8

Безусловное ветвление

PC +2 + rel8  PC

BRN rel8

Отсутствие ветвления

PC + 2  PC

Bcc rel8

Условное ветвление

PC +2+ rel8 PC, если

выполняется условие cc

BRCLR n, (opr), rel8

Ветвление при bn = 0

PC +3 + rel8  PC, если bn=0

BRSET n, (opr), rel8

Ветвление при bn = 1

PC + 3 + rel8  PC, если bn=1

DBNZ (opr), rel8

Декремент M и ветвление, если M не равно 0

M-1M,

PC + n + rel8  PC, если Z=0

DBNZA rel8

Декремент A и ветвление,

если A не равно 0

A-1A,

PC +2 + rel8  PC, если Z=0

DBNZX rel8

Декремент X и ветвление, если A не равно 0

X-1X,

PC +2 + rel8  PC, если Z=0

JSR (opr)

Переход к подпрограмме

PC + n  PC,

PCl  (SP), SP - 1  SP

PCh  (SP), SP - 1  SP

(EA)  PC

RTS

Возврат из подпрограммы

SP + 1  SP, (SP)  PCh

SP + 1  SP, (SP)  PCl

Большинство условий задается определенными значениями признаков в регистре CCR или комбинацией значений признаков, которая определяется соответствующим логическим выражением. Обычно эти значения признаков устанавливаются с помощью предыдущей команды сравнения или тестирования. Условием ветвления может быть равенство (Z=1) или неравенство (Z=0) сравниваемых операндов, а также различные варианты соотношений между ними. При сравнении операндов со знаком устанавливаются соотношения “больше”, “меньше”, “больше или равно”, “меньше или равно” ). При сравнении беззнаковых операндов аналогичные соотношения ( ) определяют условия “выше”, “ниже”, “ниже или равно”, “выше или равно”.

Таблица 2. Используемые в программе мнемокоды и условия выполнения команд условных переходов Bcc

Мнемокод

cc

Проверяемое условие

Логическое

выражение

NE

Не равно (ненулевой результат)

Z = 0

EQ

Равно (нулевой результат)

Z = 1

HI

Выше

(Z  C) = 0

LS

Ниже или равно

(Z  C) = 1

HS

Выше или равно (нет переноса)

C = 0

LO

Ниже (есть перенос)

C = 1

BGT

Больше

Z  (N  V) =0

BLE

Меньше или равно

Z  (N  V) =1

BGE

Больше или равно

N  V = 0

BLT

Меньше

N  V = 1

PL

Положительный результат

N = 0

MI

Отрицательный результат

N = 1

Команды DBNZ, DBNZA, DBNZX служат для организации программных циклов. Текущее значение счетчика циклов определяется содержимым адресуемой ячейки памяти M (команда DBNZ), аккумулятора (команда DBNZA) или регистра X (команда DBNZX). Команда производит уменьшение текущего значения числа циклов на 1 (декремент) и осуществляют ветвление (возврат) к началу цикла, если результат декремента не равен 0 (заданное количество циклов еще не реализовано). При выполнении команды DBNZ содержимое PC может увеличиваться на величину n = 2, 3 или 4 в зависимости от используемого способа адресации.

Команды BRCLR, BRSET проверяют значение n-го бита в операнде, выбираемом с помощью 8-битной прямой адресации, и выполняют ветвление, если бит соответственно равен 0 или 1. Номер проверяемого бита n задается в этих командах с помощью непосредственного операнда #Im8=n. Эти команды содержат три байта, поэтому при их выполнении содержимое PC увеличивается на 3.

Команды перехода и ветвления к подпрограмме JSR, BSR заносят из PC в стек адрес очередной команды программы, а затем загружают в PC новое содержимое. В команде JSR адрес ячейки памяти, из которой загружается новое содержимое PC, определяется с помощью индексной, индексной со смещением или прямой адресации. При этом адрес, загружаемый в стек при выполнении команды JSR, может быть больше адреса этой команды на n = 1, 2 или 3 в зависимости от используемого способа адресации: n = 1 при индексной адресации, n = 2 при индексной адресации с 8-разрядным смещением или 8-разрядной прямой адресации, n = 3 при индексной адресации с 16-разрядным смещением или 16-разрядной прямой адресации. По команде возврата из подпрограммы RTS из стека выбирается и восстанавливается прежнее содержимое PC.

Таблица 3. Используемые в программе команды арифметических и логических операций, сравнения и тестирования.

Мнемокод

Команда

Операция

ADD (opr)

Сложение

A + M  A

ADC (opr)

Сложение с переносом

A + M + С  A

INC (opr)

Инкремент M

M + 1  M

INCA

Инкремент A

A + 1  A

INCX

Инкремент X

X + 1  X

DEC (opr)

Декремент M

M - 1  M

DECA

Декремент A

A - 1  A

DECX

Декремент X

X - 1  X

CMP (opr)

Сравнение A с M

A - M, установка V,N,Z,C

CPX (opr)

Сравнение X с M

X - M, установка V,N,Z,C

CPHX (opr)

Сравнение H:X c M:M+1

H:X - M:M+1, установка V,N,Z,C

TST (opr)

Тестирование M

M - 0, установка N,Z

TSTA

Тестирование A

A - 0, установка N,Z

TSTX

Тестирование X

X - 0, установка N,Z

Таблица 4. Используемые в программе команды битовых операций и установки признаков.

Мнемокод

Команда

Операция

BCLR n, (opr)

Установка значения бита bn = 0

0  bn

BSET n, (opr)

Установка значения бита bn = 1

1  bn

Таблица 5. Используемые в программе команды пересылки.

Мнемокод

Команда

Операция

LDA (opr)

Загрузка A

M  A

LDX (opr)

Загрузка X

M  X

LDHX (opr)

Загрузка H:X

M:M  H:X

STA (opr)

Запись A в память

A  M

STX (opr)

Запись X в память

X  M

STHX (opr)

Пересылка H:X в память

H:X  M:M

MOV (opr),(opr)

Пересылка «память-память»

M1  M2

TAX

Пересылка A в X

A  X

TXA

Пересылка X в A

X  A

TAP

Пересылка A в CCR

A  CCR

TPA

Пересылка CCR в A

CCR  A

TSX

Пересылка SP+1 в H:X

SP+1  H:X

TXS

Пересылка H:X-1 в SP

H:X -1  SP

PSHA

Запись A в стек

A  (SP), SP-1  SP

PSHH

Запись H в стек

H  (SP), SP-1  SP

PSHX

Запись X в стек

X  (SP), SP-1  SP

PULA

Загрузка A из стека

SP+1  SP, (SP) A

PULH

Загрузка H из стека

SP+1  SP, (SP) H

PULX

Загрузка X из стека

SP+1  SP, (SP) X

Задание:

Разработать программу, которая из массива 10 однобайтовых чисел со знаком выделяет числа, у которых биты 1, 4 и 5 совпадают, и эти числа располагает в порядке возрастания, а остальные числа - в порядке убывания.

Ход работы

Код программы:

org $8000 ; Указываем адрес с которого начнет работу программа

mov #$0A,$81 ; Количество чисел в массиве

mov #$00,$82 ; Счетчик 1-го массива

mov #$00,$83 ; Счетчик 2-го массива

mov #$50,$84 ; Указатель для 1 массива

mov #$61,$85 ; Указатель для 2 массива

lda #$A0 ; Положить 10 значений в стек

psha

lda #$B8

psha

lda #$B8

psha

lda #$FE

psha

lda #$72

psha

lda #$45

psha

lda #$E9

psha

lda #$C4

psha

lda #$FF

psha

lda #$00

psha

N0: ; Метка для реализации цикла

jsr func ; Переход к подпрограмме func

dbnz $81,N0 ; Цикл. Уменьшаем значение в ячейке $81

; и если это значение не равно 0,то переходим к метке N0

bra Main_Loop ; Перейти на метку Main_loop

Main_Loop: ; Бесконечный цикл, обязателен.

nop

bra Main_Loop ; Перейти на метку Main_loop

func:

pulh ; Выгружаем из стека 2 байта,

; которые хранят адрес возврата из подпрограммы

pulx

pula ; Выгружаем число (одно из 10) и загружаем в аккумулятор

pshx ; Загружаем обратно адрес возврата

pshh

sta $80 ; Загружаем ту ячейку, которую хотим сравнить

brclr 1,$80,N1 ; Условие, если 1 бит числа,

; записанного в ячейке $80, равен нулю

brset 4,$80,M1 ; Значит 1-ый бит равен 1.

; Условие, если 4 бит числа,

; записанного в ячейке $80, равен единице

bra mass_2 ; Условие не выполняется, значит переходим

; к сравнению и складываем во 2 массив

N1:

brclr 4,$80,N2 ; Условие, если 4 бит числа,

; записанного в ячейке $80, равен нулю

bra mass_2 ; Условие не выполняется, значит переходим

; к сравнению и складываем во 2 массив

N2:

brclr 5,$80,mass_1 ; Условие, если 5 бит числа,

; записанного в ячейке $80, равен нулю

bra mass_2 ; Условие не выполняется, значит переходим

; к сравнению и складываем во 2-ой массив

M1: brset 5,$80,mass_1 ; Условие, если 5 бит числа,

; записанного в ячейке $80, равен единице

bra mass_2 ; Условие не выполняется, значит переходим

; к сравнению и складываем во 2-ой массив

mass_1: ; Сравнение и расположение числа в 1-ый массив

; по возрастанию

tst $82 ; Если счетчик 1-го массива равен 0

beq Q1 ; то переходим к Q1

; Если нет, то

mov $82,$86 ; Временный счетчик для цикла

ldhx #$0050 ; Указатель на первый элемент 1-го массива

N7:

lda ,X ; Загрузить в А значение элемента массива,

; на который указывает H:X

cmp $80 ; Сравниваем элемент массива с текущим значением

bge SORT ; Если элемент массива больше либо равен

; текущему значению, то переходим на SORT

; Если нет, то

incx ; Для перехода на следующий элемент 1-го массива

dbnz $86,N7 ; Цикл. Уменьшаем значение временного счётчика и

; если не равно 0, то перейти на метку N7.

; Если нет, то

mov $80,X+ ; Кладем самое большое число в конец 1-го массива

inc $82 ; Увеличиваем счетчик элементов 1-го массива

rts ; Выход из подпрограммы

Q1: ; Если число первое в 1-ом массиве

mov $80,$50 ; то кладем число в 1-ый массив

inc $82 ; Увеличиваем счетчик элементов 1-го массива

rts ; Выход из подпрограммы

SORT:

stx $87 ; Сохраняем адрес куда расположим текущее значение

lda #$50 ; Находим адрес конца 1-го массива

add $82 ;

deca ; Из за того что нумерация начинается с нуля

tax ; Переносим адрес из A->X,

; чтобы сдвинуть элементы массива

ADR: cpx $87 ; Сравниваем X и $87.

; Сравниваем адрес из массива с адресом куда вставляем

beq SORT_END ; Если адреса равны, то переходим на метку SORT_END

; Если не равны, то смещаем элементы массива:

lda ,X ; Сохраняем в аккумулятор значение

; по адресу, указанном в X

incx ; Увеличиваем адрес X, чтобы

sta ,X ; Загрузить по этому адресу,

; сохранённое в аккумуляторе значение

decx ; Уменьшаем адрес X

decx ; Уменьшаем адрес X,

; чтобы перенести предыдущий элемент массива

bra ADR ; Возврат к сравнению адресов

SORT_END:

lda ,X ; Сохраняем в А значение,

; по адресу которого будет вставлено число

incx ; Переносим указатель на соседнюю ячейку

sta ,X ; Переносим сохранённое в А значение по этому адресу

decx ; Возвращаем указатель на адрес,

; куда будем вставлять значение

mov $80,X+ ; Вставляем текущее значение в 1-ый массив

inc $82 ; Увеличиваем счетчик 1-го массива

rts ; Переход к проверке начального условия (выход из func)

mass_2: ; Сравнение и расположение числа в 2 массив по убыванию

tst $83 ; Если счетчик 2-го массива равен 0,

beq Q2 ; то переходим к Q2

; Если нет, то

mov $83,$86 ; Временный счетчик для цикла

ldhx #$0061 ; Указатель на первый элемент 2-го массива

M2:

lda ,X ; Загрузить в А значение элемента массива,

; на который указывает H:X

cmp $80 ; Сравниваем элемент массива с текущим значением

ble SORT_2 ; Если элемент массива меньше либо

; равен текущему значению, то переходим на SORT_2

; Если нет, то

incx ; Для перехода на следующий элемент 2-го массива

dbnz $86,M2 ; Цикл. Уменьшаем значение временного счётчика и

; если не равно 0, то перейти на метку M2.

; Если нет, то

mov $80,X+ ; Кладем самое маленькое число в конец 2-го массива

inc $83 ; Увеличиваем счетчик 2-го массива

rts ; Выход из подпрограммы

Q2: ; Если число первое во 2-ом массиве

mov $80,$61 ; то кладем без сравнения

inc $83 ; Увеличиваем счетчик 2-го массива

rts ; Выход из подпрограммы

SORT_2:

stx $87 ; Сохраняем адрес куда расположим текущее значение

lda #$61 ; Находим адрес конца 2-го массива

add $83 ;

deca ; Из за того что нумерация начинается с нуля

tax ; Переносим адрес из A->X,

; чтобы сдвинуть элементы массива

ADR_2: cpx $87 ; Сравниваем X и $87.

; Сравниваем адрес из массива с адресом куда вставляем

beq SORT_2_END ; Если адреса равны, то переходим на метку SORT_2_END

; Если не равны, то смещаем элементы массива:

lda ,X ; Сохраняем в аккумулятор значение

; по адресу, указанном в X

incx ; Увеличиваем адрес X, чтобы

sta ,X ; Загрузить по этому адресу,

; сохранённое в аккумуляторе значение

decx ; Уменьшаем адрес X

decx ; Уменьшаем адрес X,

; чтобы перенести предыдущий элемент массива

bra ADR_2 ; Возврат к сравнению адресов

SORT_2_END:

lda ,X ; Сохраняем в А значение,

; по адресу которого будет вставлено число

incx ; Переносим указатель на соседнюю ячейку

sta ,X ; Переносим сохранённое в А значение по этому адресу

decx ; Возвращаем указатель на адрес,

; куда будем вставлять значение

mov $80,X+ ; Вставляем текущее значение в 2-ой массив

inc $83 ; Увеличиваем счетчик 2-го массива

rts ; Переход к проверке начального условия (выход из func)

Рис. 1. Блок-схема задания

Рис. 2. Блок-схема метки сравнения и добавления элемента mass_1

Рис. 3. Блок-схема метки сравнения и добавления элемента mass_2

Рис. 4. Содержание стека после загрузки массива

Содержание первого массива, расположенного начиная с адреса $50 до $55, можно увидеть на рис. 5. Числа расположены в порядке возрастания.

Второй массив, расположен по адресам $61 - $64, также можно увидеть на рис. 5. Числа расположены в порядке убывания.

Рис. 5. Состояние памяти в режиме симуляции.

Вывод:

Программа была протестирована на массиве из 10 чисел, расположенных в ячейках памяти стека $A0, $B8, $B8, $FE, $72, $45, $E9, $C4 $FF, $00. После выполнения программы числа, в соответствии с заданием расположились в 2 массива. Первый массив, содержит числа, у которых биты 1, 4 и 5 совпадают, и эти числа располагаются в порядке возрастания. В памяти первый массив расположен в ячейках начиная с адреса $50 до адреса $55. Второй массив, содержит числа, не подходящие к условию и эти числа, располагаются в порядке возрастания. В памяти второй массив расположен в ячейках начиная с адреса $61 до адреса $64.