1-12_Лабораторная_Основы микропроцессорной техники / ОМТ_лаб_1
.docФедеральное Агентство по образованию РФ
Томский Межвузовский Центр дистанционного образования
Томский государственный университет
систем управления и радиоэлектроники (ТУСУР)
Кафедра промышленной электроники (ПрЭ)
Лабораторная работа №1
По дисциплине: «Основы микропроцессорной техники»
Тема: «Отладка прикладных программ для микропроцессора серии К580»
(Учебные пособия: «Основы микропроцессорной техники» автор: Шарапов А.В., Томск-2002; 2003)
Выполнил:
Студент ТМЦДО
Гр.
Специальность: 210106(200400)
Ф.И.О.
логин
пароль
05 февраля 2009 г.
Н-ск 2009
Цель работы: освоение системы команд микропроцессора К580ВМ80А и приобретение навыков отладки простейших программ с помощью ассемблера и эмулятора.
-
В редакторе Norton Commander создадим файл SUM1.asm:
LXI H,10h ;загрузка указателя памяти
MOV A,M ;пересылка байта из памяти в А
INX H ;увеличение содержимого пары Н на 1
ADD M ;суммирование (А) и (HL) результат в (А)
DAA ;десятичная коррекция аккумулятора
INX H ;увеличение содержимого пары Н на 1
MOV M,A ;пересылка байта из А в память
HLT ;команда останова программы
ORG 10h ;адрес первого слагаемого
DB 37h,48h ;загрузка слагаемых в память
-
Вызовем кросс ассемблер (командный файл x8085.exe), в результате обработки файла SUM1.asm , будут созданы файлы SUM1.lst и SUM.obj. Ассемблирование прошло успешно (Assembly Errors: 0).
Вызовем редактор связей (командный файл xlink.exe), в результате будет создан файл SUM1.bin, необходимый для загрузки программы в эмулятор. Вызовем эмулятор, записав в командной строке:
i8085.exe SUM1.bin
-
Созданная программа складывает числа 37h и 48h , размещённые по адресам 10h и 11h директивой ORG, и определённые директивой DB. Результат работы программы размещается по адресу 12h и равен 85h в BCD (в двоично-десятичном коде). В аккумуляторе до выполнения десятичной коррекции находится 7Fh (7Fh + 6 = 85h – результат десятичной коррекции DAA). Содержимое регистра признаков F изменяет команда ADD – знака S и дополнительного (потетрадного) переноса АС, устанавливая их в единичное состояние.
2.1 Модифицируем программу sum1.asm , использующую косвенную адресацию, в программу sum2.asm – с прямой адресацией:
LXI H,10h ;загрузка указателя памяти
LDA 11h ;загрузка в А из 11h
ADD M ;суммирование (А) и (HL) результат в (А)
DAA ;десятичная коррекция аккумулятора
STA 12h ;занесение содержимого А в 12h
HLT ;команда останова программы
ORG 10h ;адрес первого слагаемого
DB 49h,37h ;загрузка слагаемых в память
2.2 Программа sum1 занимает 10 ячеек памяти, sum2 – 12. Программа sum2.asm – меньше на 2 команды но выполняется на 2 такта дольше (sum1 – 52 машинных такта, sum2 – 54).
3.1 Проверим работу программы MAX.asm, записывающей в аккумулятор максимальное значение байтовой информации, снятой с 64 датчиков.
С помощью директивы DB, заполним массив, начиная с адреса 100h кодами символов ASCI:
LXI H,100h ;начальный адрес массива
MVI B,64 ;число элементов
XRA A ;очистка аккумулятора
M1: CMP M ;сравнение А с М
JNC M2 ;переход, если А больше
MOV A,M ;обмен, если А меньше или равно
M2: INX H ;наращивание адреса
DCR B ;декремент счетчика числа элементов
JNZ M1 ;цикл обработки массива
HLT ;останов программы
ORG 100h ;адрес первого элемента
DB 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-'
3.2 Программа выполнилась за 2396 тактов, в результате работы программы в аккумулятор попало значение 7Ah, что соответствует коду символа `z`.
4.1 Разработаем и проверим работу программы PORT.asm, выводящую в порт 81h содержимое порта 80h с обменом полубайтов:
p_in EQU 80h ;порт ввода
p_out EQU 81h ;порт вывода
IN p_in ;считать с порта
RLC ;команда циклического
RLC ;сдвига влево за четыре
RLC ;прохода обеспечивает
RLC ;обмен полубайтами
OUT p_out ;вывод в порт
HLT
4.2 Если занести в порт 80h значение 5Fh, в результате работы программы на выходе (порт 81h) получим F5h.
5.1 Проверим работу программы, реализующей двоично-десятичный счетчик, скорость инкрементирования которого зависит от времени выполнения подпрограммы временной задержки DELAY:
LXI SP,20h ;загрузка указателя стека
M2: ADI 1 ;инкремент аккумулятора
DAA ;десятичная коррекция
CALL DELAY ;вызов подпрограммы задержки
JMP M2 ;зацикливание программы
DELAY: MVI B,2 ;установка счетчика
M1: DCR B ;декремент счетчика
JNZ M1 ;переход при отсутствии нуля
RET ;возврат из подпрограммы
5.2 Прогоняя программу в пошаговом режиме, можем отметить что с каждым циклом выполнения программы, содержимое аккумулятора увеличивается на 1. При вызове подпрограммы, указатель стека изменяется с 20h на 1Еh (уменьшается на 2). При выполнении команды RET происходит, выход из подпрограммы и возврат к началу программы (М2), указатель стека изменяется на 20h. В регистре В хранится значение 2, которое последовательно уменьшается (2-1-0), при В=0 , флаг нуля Z устанавливается в единичное состояние. Признак чётности устанавливается в единицу, при PSW=2Eh. Для увеличения времени работы подпрограммы, необходимо увеличить значение счетчика (регистр В), командой MVI.
6.1 Разработаем и отладим программу (CONVP.asm), сохраняющей в стеке содержимое регистровых пар PSW и B, на время вызова подпрограммы CONV, а затем восстанавливающей их из стека:
LXI SP,32h ;загрузка указателя стека
MVI A,1Аh ;загрузка данных
MVI B,1Eh ;в регистры
MVI E,0Вh ;ввод значения для подпрограммы
PUSH PSW ;занесение содержимого
PUSH B ;регистров в стек
CALL CONV ;вызов подпрограммы
POP B ;извлечение из стека в порядке
POP PSW ;обратном занесению
JMP STOP ;переход на метку останова
CONV: MOV B,E ;пересылка в В из Е
MVI A,0 ;сброс содержимого аккумулятора
M1: ADI 1 ;инкремент аккумулятора
DAA ;десятичная коррекция
DCR B ;декремент счетчика
JNZ M1 ;переход пока не ноль
MOV E,A ;загрузка в Е из А
RET ;возврат из подпрограммы
STOP: HLT
6.2 Подпрограмма CONV, преобразует шестнадцатеричное число, находящееся в регистре E (0Вh), в двоично-десятичное 11(BCD). Команды push и call уменьшают указатель стека на 2, а команды pop и ret увеличивают на 2.
7.1 Разработаем и отладим на эмуляторе индивидуальное задание (вариант12).
7.2 Программа должна переместить в массив 106h – 10Вh числа массива 100h – 105h, в обратной последовательности. Код программы INVERT.asm:
MASS1 EQU 100h ;начальный адрес массива1
MASS2 EQU 10Bh ;конечный адрес массива2
MVI B,5 ;счетчик элементов массива
LXI H,MASS1 ;указатель памяти массива1
LXI D,MASS2 ;указатель памяти массива2
M1: MOV A,M ;загрузка в память первого эл. массива
STAX D ;пересылка содержимого аккум. в D
INX H ;увеличение указателя Н
DCX D ;декремент указателя D
DCR B ;декремент счетчика элементов
JNZ M1 ;повторение цикла пока не 0
HLT ;останов программы при 0
8. Ответы на контрольные вопросы:
-
В аккумуляторе микропроцессора, выполняются: поразрядное И, поразрядное исключающее ИЛИ, поразрядное ИЛИ.
-
Число, с которым производится сравнение, сначала преобразуется в дополнительный код (инвертируется, увеличивается на единицу, в триггер переноса записывается 1 как признак отрицательного числа), а затем суммируется с содержимым аккумулятора. Признаки, формируемые при сложении, запоминаются в регистре F и анализируются последующими командами условного перехода, а содержимое аккумулятора восстанавливается прежним (содержимое аккумулятора не меняется, меняются признаки).
-
Аккумулятор можно обнулить командами XRA; MVI A,0; LDA r (при условии в r нулевой байт).
-
К достоинствам языка Ассемблер, можно отнести – компактность, скорость выполнения программ, возможность доступа к портам ввода – вывода. К недостаткам можно отнести – трудность создания сложных программ, необходимость контроля при создании программ, адресации и содержимого регистров.