Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Московский государственный технический университет им. Н.Э. Баумана
Факультет «Информатика и системы управления»
Кафедра «Компьютерные системы и сети»
Группа ИУ6-72
Микропроцессорные системы
Лабораторная работа №2
Арифметическая обработка данных
Отчет
Студенты: Гречищев К.М.
Порядин И.А.
Преподаватель: Хартов В.Я.
Москва 2011
Цель работы:
изучение способов представления числовых данных в микроконтроллерах, алгоритмов арифметических операций, программирование арифметических процедур.
Исходный код программы:
;************************************************************************
;Программа тестирования в STK500 двоичных арифметических операций
; сложения, вычитания, умножения, деления
;Порт PD - порт управления для выбора операндов и операций
;Порт PB - порт индикации исходных операндов и результатов операции
;Соединения шлейфами: порт PB-LED, порт PD-SW
;************************************************************************
.include "m8515def.inc" ;файл определений для ATmega8515
;Выводы порта PD
.equ SW_op_AL = 0 ;кнопка выбора операнда op_AL
.equ SW_op_AH = 1 ;кнопка выбора операнда op_AH
.equ SW_op_BL = 2 ;кнопка выбора операнда op_ВL
.equ SW_ADD = 3 ;кнопка операции сложения res=op_AL+op_ВL
.equ SW_SUB = 4 ;кнопка операции вычитания res=op_AL-op_ВL
.equ SW_MUL = 5 ;кнопка операции умножения shov.res=op_AL x op_ВL
.equ SW_DIV = 6 ;кнопка операции деления res=op_AH.op_AL/op_ВL
.equ SW_SHOW = 7 ;кнопка для просмотра признаков сложения-вычитания,
;старшего байта произведения или остатка при делении
.def op_AL = r16 ;1-й операнд АL
.def op_AH = r17 ;старший байт делимого AH
.def op_BL = r18 ;2-й операнд ВL
.def res = r1 ;результат операции (сумма, разность,
; младший байт произведения или частное)
.def show = r31 ;регистр признаков сложения-вычитания,
; старшего байта произведения или остатка при делении
.def mul_l = r21 ;младший байт произведения
.def mul_h = r22 ;старший байт произведения
.def copy_AH = r23 ;копия старшего байта делимого
.def copy_AL = r24 ;копия младшего байта делимого
.def copy_BL = r25 ;копия множителя
.def temp = r26 ;временный регистр
.def sw_reg = r27 ;регистр состояния кнопок
.def count = r28 ;число операндов в таблице операндов
.def c_bit = r29 ;счетчик циклов умножения (деления)
.def temp = r30
.macro vvod ;ввод операнда
lpm ;считывание байта из flash-памяти в r0
mov @0,r0 ; и пересылка в регистр операнда
mov res, r0
adiw zl, 1 ;увеличение указателя адреса на 1
dec count
brne exit
ldi ZL,low(tabl_op*2) ;перезагрузка начала таблицы операндов
ldi ZH,high(tabl_op*2) ; в регистр Z
ldi count, 16
exit: nop
.endmacro
.org $000
;Инициализация
ldi temp,low(RAMEND) ;установка
out SPL,temp ; указателя стека
ldi temp,high(RAMEND) ; на последнюю
out SPH,temp ; ячейку ОЗУ
ser temp ;настройка
out DDRB,temp ; порта PB
out PORTB,temp ; на вывод
clr temp ;настройка
out DDRD,temp ; порта PD
ser temp ; на
out PORTD,temp ; ввод
ldi ZL,low(tabl_op*2) ;загрузка адреса таблицы операндов
ldi ZH,high(tabl_op*2) ; в регистр Z
ldi count,16 ;число операндов 16
;Опрос кнопок и выполнение заданных действий
LOOP: in sw_reg,PIND
sbrs sw_reg,0
rjmp f_op_AL
sbrs sw_reg,1
rjmp f_op_AH
sbrs sw_reg,2
rjmp f_op_BL
sbrs sw_reg,3
rjmp add_bin
sbrs sw_reg,4
rjmp sub_bin
sbrs sw_reg,5
rjmp mul_bin
sbrs sw_reg,6
rjmp div_bin
sbrc sw_reg,7
rjmp loop
mov res,show
rjmp outled
;Выборка 1-го операнда из таблицы операндов
f_op_AL: vvod op_AL
rjmp outled
;Выборка старшего байта 1-го операнда (при делении)
f_op_AH: vvod op_AH
rjmp outled
;Выборка 2-го операнда
f_op_BL: vvod op_BL
rjmp outled
;Сложение 8-разрядных операндов
add_bin: mov res,op_AL
add res,op_BL
in show,SREG ;выборка из регистра SREG
rjmp outled
;Вычитание 8-разрядных операндов
sub_bin: mov res,op_AL
sub res,op_BL
in show,SREG ;выборка из регистра SREG
rjmp outled
;Умножение 8-разрядных операндов
mul_bin: clr mul_l ;очистка младшего
clr mul_h ; и старшего байта произведения
ldi c_bit,8 ;счетчик циклов
mov copy_BL,op_BL
L1: clc ;очистка флага C
sbrc copy_BL,0 ;проверка младшего бита множителя
add mul_h,op_AL ;прибавление множимого AL
L2: ror mul_h ;сдвиг вправо
ror mul_l ; 2-х байтов произведения
lsr copy_BL ;сдвиг множителя вправо
L3: dec c_bit ;уменьшение счётчика циклов
brne L1 ;если не 0, продолжаем умножение
mov res,mul_l ;выводимые значения - младший
mov show,mul_h ; и старший байты произведения
rjmp outled
;Деление 16-разрядного числа на 8-разрядное
div_bin: sbrc op_AH,7 ;ошибки исходных данных
rjmp error
sbrc op_BL,7
rjmp error
tst op_BL ;ошибка при делении на 0
brsh error
cp op_AH,op_BL ;ошибка при переполнении
brge error
clr res ;обнуляем частное
ldi c_bit,8 ; число итераций
mov copy_AH,op_AH
mov copy_AL,op_AL
L4: clc
rol copy_AL ;сдвиг
rol copy_AH ; делимого
lsl res ;сдвиг частного влево
sub copy_AH,op_BL ;вычитание делителя
brcs recov ;если остаток < 0,переход
inc res ; иначе добавить 1 в частное
rjmp L5
recov: add copy_AH,op_BL ;восстановление остатка
L5: dec c_bit
brne L4
mov show,copy_AH ;пересылка остатка
rjmp outled
error: clr show
out PORTB,show
rcall delay
ser show
out PORTB,show
rjmp wait
outled: com res
out portb,res
rcall delay
wait: in sw_reg,PIND ;ждать, пока кнопка не отпущена
com sw_reg
brne wait
rjmp loop
; Задержка
DELAY: ldi r21,8
m1: ldi r19,250
m3: ldi r20,250
m2: dec r20
brne m2
dec r19
brne m3
dec r21
brne m1
ret
; Таблица операндов
tabl_op: .db 0xE5,0x10,0x1E,0xAA,0x6C,0xC7,0x1D,0xE2
.db 0x15,0xD6,0x0E,0xB6,0x5D,0xB7,0x03,0xB2
1. Выполнить ряд примеров на сложение и вычитание, выбирая операнды слагаемых АL и ВL нажатием кнопок SW0 и SW2. Объяснить результаты операций при нажатиях кнопки SW3 (сложение) и SW4 (вычитание), рассматривая операнды как беззнаковые числа, затем как числа со знаком.
Сложение |
||||
Число А2/A10 |
Число B2/B10 |
А+В |
Признаки: HSVNZC |
Комментарий |
00010000/16 Беззнаковое |
00011110/30 Беззнаковое |
00101110/46 |
0 0 0 0 0 0 |
|
11100101/229 Беззнаковое |
00010000/16 Беззнаковое |
11110101/245 |
0 1 0 1 0 0 |
Так как числа беззнаковые, то флаги S и N можно проигнорировать |
11100101/-27 Со знаком |
00010000/16 Со знаком |
11110101/-11 |
0 1 0 1 0 0 |
S = 1 Число отрицательное N = 1 Число отрицательное, т.к. не было переполнения |
11100010/226 Беззнаковое |
01011101/93 Беззнаковое |
00111111/63 |
0 0 0 0 0 1 |
С = 1 Произошел перенос в разряд 28 28 + 63 = 319 |
11100010/-30 Со знаком |
01011101/93 Со знаком |
00111111/63 |
0 0 0 0 0 1 |
V = 0 Переполнения нет |
11100101/229 Беззнаковое |
11010110/214 Беззнаковое |
10111011/187 |
0 1 0 1 0 1 |
С = 1 Произошел перенос в разряд 28 28 + 187 = 443 Так как числа беззнаковые, то флаги S и N можно проигнорировать |
11100101/-27 Со знаком |
11010110/-42 Со знаком |
10111011/-69 |
0 1 0 1 0 1 |
V = 0 Переполнения нет S = 1 Знак отрицательный |
Вычитание |
||||
Число А2/A10 |
Число B2/B10 |
А-В |
Признаки: HSVNZC |
Комментарий |
11111111/255 Беззнаковое |
01111110/126 Беззнаковое |
10000001/129 |
0 1 0 1 0 0 |
Так как числа беззнаковые, то флаги S и N можно проигнорировать |
11111111/-1 Со знаком |
01111110/126 Со знаком |
10000001/-127 |
0 1 0 1 0 0 |
S = 1 Знак отрицательный |
00000011/3 Беззнаковое |
01101100/108 Беззнаковое |
10010111/151 |
1 1 0 1 0 1 |
С = 1 Произошел перенос в разряд 28 151 - 28= - 105 |
00000011/3 Со знаком |
01101100/108 Со знаком |
10010111/-105 |
1 1 0 1 0 1 |
S = 1 Знак отрицательный Флаг C игнорируем, т.к. числа со знаком |
2. Выполнить ряд примеров умножения 8-разрядных двоичных чисел. Нажатие кнопки SW5 показывает младший байт произведения, SW7 старший байт.
Число А2/A10 |
Число B2/B10 |
А*В |
Комментарий |
00010000/16 |
00000011/3 |
00000000 00110000/48 |
Верно |
11100101/229 |
11100010/226 |
11001010 00101010/51754 |
Верно |
10101010/170 |
00001110/14 |
00001001 01001100/2380 |
Верно |
11111111/255 |
11111111/255 |
11111110 00000001/65025 |
Верно |
3. Выполнить деление беззнаковых чисел, 16-разрядного делимого на 8-разрядный делитель, с восстановлением остатка при условиях, что делитель не равен 0 и его значение не вызовет переполнения, а также делимое и делитель заданы с нулевыми значениями старших разрядов.
Число А2/A10 |
Число B2/B10 |
А/В |
Остаток |
Комментарий |
00010000 11111111/4351 |
01011101/93 |
00101110/46 |
01001001/73 |
Верно |
00000000 00000011/3 |
00000011/3 |
00000001/1 |
00000000/0 |
Верно |
01101111 11111111/28671 |
01110000/112 |
11111111/255 |
01111111/127 |
Верно |
01111110 11111111/32511 |
01111111/127 |
11111111/255 |
01111110/126 |
Верно |
4. Реализовать сложение двоично-десятичных чисел
;Сложение 8-разрядных операндов
add_bin:
subi op_AL, 0x9A
mov res, op_AL
add res,op_BL
MOV r17, res
clt
BRCC LABEL0
set
LABEL0:
BRHS LABEL1
SUBI r17, 0x06
LABEL1:
BRTS LABEL2
SUBI r17, 0x60
LABEL2:
MOV res, r17
in show,SREG ;выборка из регистра SREG
rjmp outled