Скачиваний:
24
Добавлен:
23.06.2014
Размер:
39.94 Кб
Скачать

Министерство Образования Российской Федерации

Томский Университет Систем Управления и Радиоэлектроники (ТУСУР)

Лабораторная работа №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.

В. Назвать достоинства и недостатки языка Ассемблера по сравнению с языками высокого уровня.

О. Достоинствами Ассемблера является в первую очередь его гибкость, то есть с его помощью можно писать более компактные программы, что не всегда могут позволить языки высокого уровня. На Ассемблере можно написать всё что только можно сделать с компьютером. Программы, написанные на Ассемблере, отличаются большей производительностью, меньшими размерами исполняемых файлов, менее требовательны к ресурсам (объём памяти, скорость процессора и т.д.). Единственным недостатком является сложность написания исходного кода. Человек должен сам следить за стеком, памятью, контролировать в любой момент выполнения программы содержимое всех регистров, в то время как компиляторы языков высокого уровня делают это сами. На Ассемблере удобно выполнять критические части программы, (к примеру, при работе с нестандартными устройствами кроме Ассемблера не поможет ни один из языков высокого уровня) а интерфейс и основную часть кода лучше писать на языках высокого уровня, так быстрее. Программирование на Ассемблере это интересный и очень трудоёмкий процесс, отнимающий массу времени, но иногда без него просто не обойтись.

6