1-Лабораторная_Основы микропроцессорной техники_2 / Lab_1_OMT
.docМинистерство Образования Российской Федерации
Томский Университет Систем Управления и Радиоэлектроники (ТУСУР)
Лабораторная работа №1
по предмету "Основы микропроцессорной техники"
Отладка прикладных программ для микропроцессора серии К580
1. Цель работы:
Целью лабораторной работы является освоение системы команд микропроцессора К580ВМ80А и приобретение навыков отладки простейших программ с помощью компилятора и эмулятора.
2. Программа "sum.asm"
lxi h,10h
mov a,m
inx h
add m
daa
inx h
mov m,a
hlt
Первая команда программы (lxi h,10h) загружает в регистр h число 10h следующая команда (mov a,m) загружает в аккумулятор байт находящийся в памяти по адресу, хранящемуся в регистре h. Команда inx h увеличивает содержимое регистра h на единицу (скажем так "смещает текущий указатель на следующий байт памяти"). Команда add m прибавляет к содержимому аккумулятора текущий байт памяти, адрес которого хранится в h. Команда десятичной коррекции преобразует содержимое аккумулятора в двоично-десятичный код (BCD). Снова команда inx h "перемещает текущий указатель на следующую ячейку памяти", в которую командой mov m,a загружается содержимое аккумулятора, т.е. результат сложения данных чисел. Команда hlt завершает работу программы.
После трансляции исходного кода данной программы на диске в текущей директории появились два файла: sum.dbg и sum.lst, это значит, что в программе отсутствуют синтаксические ошибки и ошибки времени компиляции, для поиска логических ошибок воспользуемся отладчиком. Простейший дебагер d580.exe позволяет при трассировке программы (выполнении по шагам команда за командой) выявить (если есть) логические ошибки, т.е. ошибки в алгоритмах программы.
Запишем числа 37h и 48h в ячейки памяти 10h и 11h соответственно, запускаем программу на выполнение в пошаговом режиме.
После выполнения программы делаем вывод:
На выполнение данной программы затрачено 52 машинных такта.
Результат сложения чисел (85h) находится в ячейке 12h памяти.
До выполнения команды десятичной коррекции (DAA) в аккумуляторе (А) находилось число 7fh.
Команда DAA изменила в регистре признаков F флаг знака S и флаг дополнительного переноса AC, установив их в 1.
Изменив исходные числа на 25h и 30h, запускаем программу в автоматическом режиме. Результат сложения этих чисел (55h) находится по тому же адресу 12h.
В рассмотренном примере использовалась только косвенная адресация при обращении к памяти. Создадим новый файл "sum1.asm" введём команды, которые выполнят то же самое, что и в первом примере, но с использованием прямой адресации к памяти.
lxi h,10h
lda 11h
add m
daa
sta 12h
hlt
На выполнение данной программы затрачено 54 машинных такта, на 2 такта больше, чем в первом примере. Отсюда сделаем вывод: если исходить из производительности, то Ассемблер является языком, на котором можно писать более производительные программы, более быстрые и компактные чем на языках высокого уровня. К примеру, используя косвенную адресацию вместо прямой мы получим те же результаты, но раньше на 2 машинных такта, разница небольшая, а если всё это выполняется в цикле, расхождение будет "ощутимым".
3. Проверить работу программы, записывающей в аккумулятор максимальное значение байтовой информации, снятой с 64 датчиков в ОЗУ пользователя начиная с адреса 100h:
lxi h,100h
mvi b,64
xra a
m1: cmp m
jnc m2
mov a,m
m2: inx h
dcr b
jnz m1
hlt
Программа выполнилась за 2431 такт. Максимальное число из введённого массива действительно попало в аккумулятор.
Программа поочерёдно сравнивает все элементы массива с содержимым аккумулятора, и загружает в аккумулятор элемент, если он больше.
4. Проверить на эмуляторе выполнение программы, выводящей в порт с адресом 81h содержимое порта 80h с обменом полубайтов.
mvi a,90h
out 83h
in 80h
rrc
rrc
rrc
rrc
out 81h
hlt
Программа выполнилась за 60 машинных тактов.
5. Проверить работу программы, реализующую двоично-десятичный счётчик.
lxi sp,20h
m2: adi 1
daa
call delay
jmp m2
delay: mvi b,2
m1: dcr b
jnz m1
ret
При вызове подпрограммы в стеке сохраняется адрес текущей команды. Содержимое указателя стека уменьшается на 2 так как адрес занимает 2 байта в памяти (20h-02h=1eh). При выполнении команды ret происходит возврат из подпрограммы, извлекается адрес команды из стека, указатель стека смещается в исходное состояние (адрес 20h памяти) и управление передаётся команде, следующей за командой вызова подпрограммы.
Для того чтобы уменьшить скорость работы счётчика, нужно увеличить задержку. Это можно сделать, заменив строку delay: mvi b,2 на delay: mvi b,100.
6. Разработайте и проверьте работу программы, сохраняющей в стеке содержимое регистровых пар psw и b на время вызова подпрограммы conv, а затем восстанавливающей их из стека.
lxi sp,30h
mvi a,12h
mvi b,34h
mvi c,56h
mvi e,20h
push psw
push b
call conv
pop b
pop psw
jmp end
conv: mov b,e
mvi a,0
m1: adi 1
daa
dcr b
jnz m1
mov e,a
ret
end: hlt
Подпрограмма переводит числа из шестнадцатеричной в десятичную систему исчисления (20h – 32). Исходные данные берёт из регистра e, там же сохраняет результат.
Содержимое регистра sp уменьшается в программе при выполнении команд push и call, а увеличивается командами pop и ret. Команда push сохраняет в стеке содержимое регистровой пары и уменьшает значение указателя стека на 2, а команда pop извлекает с вершины стека слово (2 байта), записывает его в регистровую пару и увеличивает значение регистра sp на 2.
7. Проверить с помощью эмулятора работу программы сортировки массива.
org 0
lxi sp,30h
lxi h,30h
mvi d,4
m1: push h
push d
mvi c,0
m2: mov a,m
inx h
cmp m
jc m3
mov b,m
mov m,a
dcx h
mov m,b
inx h
mvi c,1
m3: dcr d
jnz m2
mov a,c
ora a
pop d
pop h
jnz m1
hlt
Процесс сортировки занял 1596 машинных тактов.
Байты регистровой пары h загружаются в стек в следующей последовательности: сначала в стек по адресу 2fh загружается байт из регистра h, затем указатель стека смещается на ячейку памяти с адресом 2eh, и туда записывается значение регистра l.
В счётчик загружается число на единицу меньшее числа элементов массива потому, что при сравнении двух элементов массива берутся текущий элемент (х) и соседний (х+1); у последнего элемента нет соседнего (его не с чем сравнивать).
Если бы программа была на 8 байт длиннее, нам бы пришлось сменить адрес начала стека, так как числа, заносимые в стек изменили бы машинный код программы в памяти, что привело бы к непредсказуемым последствиям. Адрес начала массива можно оставить прежним.
8. Контрольные вопросы:
В. Какие логические операции выполняются в аккумуляторе микропроцессора?
О. Поразрядные операции И, ИЛИ, Исключающее ИЛИ; операция сравнения cpi.
В. Как изменится содержимое аккумулятора после выполнения команды
cpi 0fbh?
О. Число, с которым производится сравнивание, сначала преобразуется в дополнительный код, а затем суммируется с содержимым аккумулятора. признаки формируемые при сложении запоминаются в регистре f, а содержимое аккумулятора восстанавливается.
В. Какими командами можно обнулить аккумулятор?
О. cma; mvi a,0; ani 0; xra a; lda h если в ячейке с указанным адресом содержится 0.
В. Назвать достоинства и недостатки языка Ассемблера по сравнению с языками высокого уровня.
О. Достоинствами Ассемблера является в первую очередь его гибкость, то есть с его помощью можно писать более компактные программы, что не всегда могут позволить языки высокого уровня. На Ассемблере можно написать всё что только можно сделать с компьютером. Программы, написанные на Ассемблере, отличаются большей производительностью, меньшими размерами исполняемых файлов, менее требовательны к ресурсам (объём памяти, скорость процессора и т.д.). Единственным недостатком является сложность написания исходного кода. Человек должен сам следить за стеком, памятью, контролировать в любой момент выполнения программы содержимое всех регистров, в то время как компиляторы языков высокого уровня делают это сами. На Ассемблере удобно выполнять критические части программы, (к примеру, при работе с нестандартными устройствами кроме Ассемблера не поможет ни один из языков высокого уровня) а интерфейс и основную часть кода лучше писать на языках высокого уровня, так быстрее. Программирование на Ассемблере это интересный и очень трудоёмкий процесс, отнимающий массу времени, но иногда без него просто не обойтись.