Лабораторная работа №4 / Laboratornaya_rabota_4N
.docxМИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИ РОССИЙСКОЙ ФЕДЕРАЦИИ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«МОСКОВСКИЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»
(МОСКОВСКИЙ ПОЛИТЕХ)
Факультет машиностроения
Кафедра «Автоматика и управление»
Лабораторная работа №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-1M, PC + n + rel8 PC, если Z=0 |
DBNZA rel8 |
Декремент A и ветвление, если A не равно 0 |
A-1A, PC +2 + rel8 PC, если Z=0 |
DBNZX rel8 |
Декремент X и ветвление, если A не равно 0 |
X-1X, 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.