Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Министерство образования и науки Российской Федерации
Федеральное агентство по образованию
Государственное образовательное учреждение высшего профессионального образования
«Московский государственный технический университет имени Н.Э. Баумана»
(МГТУ им. Н.Э. Баумана)
Факультет «Информатика и системы управления»
Кафедра «Компьютерные системы и сети»
по курсу «Микропроцессорные системы»
АРИФМЕТИЧЕСКАЯ ОБРАБОТКА ДАННЫХ
Исполнители
студ. гр. ИУ 6-71 ___________ М.И. Жильников
студ. гр. ИУ 6-71 ___________ В.Э. Подольский
Преподаватель
___________ В.Я. Хартов
2011
Цель работы изучение способов представления числовых данных в микроконтроллерах, алгоритмов арифметических операций, программирование арифметических процедур.
Практическая часть.
Выполнить операцию сложения двоичных чисел, задавая слагаемые А и В числами без знака, затем числами со знаком. В последнем случае ввод отрицательных чисел выполнить в дополнительном коде.
Результат вычислений приведен в таблице 1.
Таблица 1 Таблица результатов операции сложения
А10 |
А2 |
В10 |
В2 |
R10 |
R2 |
Признаки: H S V N Z C |
122 |
01111010 |
64 |
01000000 |
186 |
10111010 |
0 0 1 1 0 0 |
+105 |
01101001 |
+106 |
01101010 |
-45 |
11010011 |
1 0 1 1 0 0 |
-118 |
10001010 |
+112 |
01110000 |
-6 |
11111010 |
0 1 0 1 0 0 |
-42 |
11010110 |
+120 |
01111000 |
+78 |
01001110 |
0 0 0 0 0 1 |
-90 |
10100110 |
-32 |
11100000 |
-122 |
10000110 |
0 1 0 1 0 1 |
Для отображения признаков результата используются флаги :
C перенос при сложении (заем при вычитании), Z признак нулевого результата,
N знак результата при операциях с числами со знаком, V переполнение разрядной сетки, S=NV знак результата вне зависимости от переполнения, H межтетрадный перенос (заем).
122 01111010
64 01000000 C=0, Z=0, N=1, V=P6P7=1, S=N+V=0, H=0
186 10111010 (флаги N и V учитываются для операций со знаками)
+105 01101001
+106 01101010 C=0, Z=0, N=1, V=P6P7=1, S=N+V=0, H=1
-45 11010011
-118 10001010
+112 01110000 C=0, Z=0, N=1, V=P6P7=0, S=N+V=1, H=0
-6 11111010
-42 11010110
+120 01111000 C=1, Z=0, N=0, V=P6P7=0, S=N+V=0, H=0
+78 01001110
-90 10100110
-32 11100000 C=1, Z=0, N=1, V=P6P7=0, S=N+V=1, H=0
-122 10000110
Выполнить операцию вычитания двоичных чисел, задавая слагаемые А и В числами без знака, затем числами со знаком. В последнем случае ввод отрицательных чисел выполнить в дополнительном коде.
Результат вычислений приведен в таблице 2.
Таблица 2 Таблица результатов операции вычитания
А10 |
А2 |
В10 |
В2 |
R10 |
R2 |
Признаки: H S V N Z C |
122 |
01111010 |
64 |
01000000 |
58 |
00111010 |
0 0 0 0 0 0 |
+105 |
01101001 |
+106 |
01101010 |
-1 |
11111111 |
1 1 0 1 0 1 |
-118 |
10001010 |
+112 |
01110000 |
+26 |
00011010 |
0 1 1 0 0 0 |
-42 |
11010110 |
+120 |
01111000 |
+94 |
01011110 |
1 1 1 0 0 0 |
-90 |
10100110 |
-32 |
11100000 |
-58 |
11000110 |
0 1 0 1 0 1 |
Для отображения признаков результата используются флаги :
C перенос при сложении (заем при вычитании), Z признак нулевого результата,
N знак результата при операциях с числами со знаком, V переполнение разрядной сетки, S=NV знак результата вне зависимости от переполнения, H межтетрадный перенос (заем).
C=0, Z=0, N=0, V=P6P7=0, S=N+V=0, H=0
(флаги N и V учитываются для операций со знаками)
C=1, Z=0, N=1, V=P6P7=0, S=N+V=1, H=1
C=0, Z=0, N=0, V=P6P7=1, S=N+V=1, H=0
C=0, Z=0, N=0, V=P6P7=1, S=N+V=1, H=1
C=1, Z=0, N=1, V=P6P7=0, S=N+V=1, H=0
Выполнить ряд примеров умножения 8-разрядных двоичных чисел
Результат вычислений приведен в таблице 3.
Таблица 3 - Таблица результатов операции умножения
А10 |
А2 |
В10 |
В2 |
RH |
RL |
0 |
00000000 |
8 |
00001000 |
00000000 |
00000000 |
120 |
01111000 |
10 |
00001010 |
00000100 |
10110000 |
127 |
01111111 |
127 |
01111111 |
00111111 |
00000001 |
255 |
11111111 |
255 |
11111111 |
11111110 |
00000001 |
Выполнить деление чисел с восстановлением остатка при условии, что делитель больше 0 и его значение не вызовет переполнения. Результат вычислений приведен в таблице 4.
Таблица 4 - Таблица результатов операции деление
А10 |
АH |
AL |
В10 |
B2 |
Частное |
Остаток |
100 |
00000000 |
01100100 |
50 |
00110010 |
00000010 |
00000000 |
30 |
00000000 |
00011110 |
0 |
00000000 |
11111111 |
00011110 |
0 |
00000000 |
00000000 |
32 |
00100000 |
00000000 |
00000000 |
Изменить программу деления, включив в нее проверку делителя на 0 и проверку на переполнение. Для обоих случаев прекратить деление, индицируя аномальный случай включением/выключением всех светодиодов.
Ниже представлен текст измененной программы :
;************************************************************************
;Программа эмуляции арифметического устройства
;SW0 установка/сброс 0-ого бита
;SW1 установка/сброс 1-ого бита
;SW2 установка/сброс 2-ого бита
;SW3 установка/сброс 3-ого бита
;SW4 - обмен местами младшей и старшей тетрады
;SW5 - запись кода операции, 2-х (а при делении 3-х) байтов операндов
;и выполнение операции при третьем нажатии кнопки (или 4-ом при делении)
;SW6 - показ байта суммы или разности, или младшей части произведения,
; или частного при делении
;SW7 - показ байта признаков результата сложения или вычитания,
; или старшего байта произведения, или остатка при делении
;Соединения шлейфами: порт PB-LED, порт PD-SW
;************************************************************************
;.include "8515def.inc" ;файл определений для AT90S8515
.include "m8515def.inc" ;файл определений для ATmega8515
.def temp = r16 ;временный регистр
.def sw_cod = r17 ; код состояния замкнутой кнопки
.def operand = r18 ;операнд
.def count = r22 ;счётчик ввода
.def count_bit = r23 ;счетчик циклов умножения (деления)
.def cop = r24 ;код операции
.def semafor = r25
.def op_A = r1 ;операнд А
.def op_B = r2 ;операнд В
.def op_AH = r3 ;старший байт делимого
.def mul_l = r4 ;младший байт произведения
.def mul_h = r5 ;старший байт произведения
.def res = r6 ;частное
.def show1 = r19 ;1-й выводимый байт результата
.def show2 = r20 ;2-й выводимый байт
;***Выводы порта PD***
.equ SW_SWAP = 4 ;кнопка обмена
.equ SW_WR = 5 ;кнопка записи операндов
.equ SW6 = 6 ;кнопки просмотра результатов
.equ SW7 = 7
.macro test_sw
sbic PIND, @0 ;проверка кнопки SWx(x=0,1,2,3)
rjmp quit ; и установка
bld sw_cod, @0 ; бита замкнутой кнопки
eor operand, sw_cod ;переключение бита
com operand ;инвертирование для вывода
out PORTB,operand ; на СД
com operand ;инвертирование
clr sw_cod ;очистка кода кнопки
rcall DELAY ;задержка
wait: sbis PIND, @0
rjmp wait
quit: nop
.endmacro ;test_sw
.macro test_show
sbic PIND, @0 ;проверка кнопки
rjmp quit ; SW6(SW7)
com @1
out PORTB, @1 ;вывод на СД
com @1
rcall DELAY ;задержка
wait: sbis PIND, @0
rjmp wait
quit: nop
.endmacro ;test_show
.org $000
rjmp init
;***Инициализация***
INIT: 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 ; ввод
clr sw_cod ;очистка кода кнопки
clr operand ;очистка операнда
set ;SREG.Т=1
ldi semafor,1
ser count ;count=0xff - для обхода подпрограммы oper
LOOP: test_sw 0 ;опрос кнопок 0,1,2,3
test_sw 1
test_sw 2
test_sw 3
rcall test_SWAP ;опрос кнопки обмена тетрадами
rcall test_WR ;опрос кнопки записи
cpi count,0 ;условие перехода к обработке операндов
brne SW_SHOW
rcall oper ;вызов арифметической операции
ldi semafor,1
ser count
SW_SHOW: test_show SW6,show1
test_show SW7,show2
rjmp LOOP
;Вызываемые подпрограммы
;***********модуль арифметических операций
OPER : cpi cop,1 ;анализ КОП
brne b2
;***********сложение или вычитание 8-разрядных операндов
add op_A,op_B
b0: mov show1,op_A ; выводимые значения - сумма
in show2,SREG ; и признаки из регистра SREG
andi show2,0xbf ;обнуление флага T
ret
b2: cpi cop,2
brne b3
sub op_A,op_B
rjmp b0
b3: cpi cop,3
brne b4
;***********модуль умножения 8-разрядных операндов
mov mul_h,op_A
mov mul_l,op_B
or mul_h,mul_l ;Установка флага Z, если один из
tst mul_h ; сомножителей равен 0.
breq sh
clr mul_l ;очистка младшего байта произведения
clr mul_h ;очистка старшего байта произведения
ldi count_bit,8 ;счетчик циклов
L1: sbrc op_B,0 ;проверка младшего разряда множителя
add mul_h,op_A ;прибавление множимого А, если B0=1
L2: ror mul_h ;сдвиг
ror mul_l ; вправо 2-х байтов произведения
lsr op_B ;сдвиг множителя вправо на 1 разряд
clc ;очистка флага C
L3: dec count_bit ;уменьшение счётчика циклов
brne L1 ;если не 0, продолжаем умножение
sh: mov show1,mul_l ; выводимые значения - младший
mov show2,mul_h ; и старший байты произведения
ret
b4: cpi cop,4
brne b5
;**********модуль деления 16-разрядного числа на 8-разрядное
DIV: clr res ;обнуляем частное
tst op_B ;проверка делителя на ноль
breq DIV_0 ; на ноль
cp op_AH,op_B ;проверка
brsh DIV_0 ; на переполнение
ldi count_bit,8 ; результат 8-разрядный
L4: rol op_A ;сдвиг
rol op_AH ; делимого
lsl res ;сдвиг частного
sub op_AH,op_B ;вычитание делителя
brcs recov ;если остаток < 0,переход
ldi temp,0x01 ;иначе установка
or res,temp ; разряда частного в 1
rjmp L5
recov: add op_AH,op_B ; и восстановление остатка
L5: dec count_bit
brne L4
mov show1,res ; выводимые значения - частное
mov show2,op_AH ; и остаток
DIV_0: clr op_B ; зажигание всех светодиодов
out PORTB,op_B ;
b5: ret
;*** обмен тетрадами ***
test_SWAP:
sbic PIND,SW_SWAP ;проверка кнопки
rjmp quit ; SWAP(SW4)
swap operand ;обмен тетрадами операнда
com operand ;инвертирование для вывода
out PORTB,operand ; на СД
com operand ;инвертирование
rcall DELAY ;задержка
wait: sbis PIND,SW_SWAP
rjmp wait
quit: nop
ret
;*** подпрограмма ввода байта от кнопки с уменьшением счетчика нажатий
; после каждой записи
test_WR: sbic PIND,SW_WR ;проверка кнопки
rjmp w_quit ; WR(SW5)
rcall DELAY ;задержка
cpi semafor,1
brne w3 ;переход для загрузки операндов
clr semafor ;сброс после 1-го входа
mov cop,operand ;запись кода операции
cpi cop,4 ;деление?
breq w_div
ldi count,3 ;если нет, счетчик записи = 3
rjmp clear
w_div: ldi count,4 ;иначе счетчик записи = 4
rjmp clear
w3: cpi count,3
brne w2 ;переходы по значению счетчика
mov op_AH,operand ;запись первого операнда
rjmp clear
w2: cpi count,2
brne w1
mov op_A,operand ;запись первого операнда
rjmp clear
w1: mov op_B,operand ;запись второго операнда
clear: dec count
clr operand ;очистка для записи новых значений
ser temp ;гашение
out PORTB,temp ; светодиодов
wait5: sbis PIND, SW_WR
rjmp wait5
w_quit: nop
ret
;*** Задержка ***
DELAY: ldi r26,10
ldi r27,255
ldi r21,255
dd: dec r21
brne dd
dec r27
brne dd
dec r26
brne dd
ret