Хартов В.Я. Микроконтроллеры AVR. Практикум для начинающих (2007) (1264222), страница 12
Текст из файла (страница 12)
70 1011 0110 ь 0010 0101 25 1101 1011 3. Арифметическая обработка данных Таким образом, сложение беззнаковых чисел (как и модулей ~А( + !В~) можно выполнить по алгоритму, схема которого приведена на рис. 3.6: 1) двоично-десятичный код первого операнда ан 1а„з...а1ао складывается с кодом 66...66, образуя первую промежуточную СУММУ Лп — !вн — 2"'Л1ХО 2) к полученной сумме прибавляется двоично-дескгичный код второго операнда Ь„,Ьн зЬ,Ьо, образуя вторую промежуточную в в ч Суыыу Хн !Лн З..Л1ЛО,' 3) потетрадно выполняется коррекция результата. Правило коррекции формулируется следующим образом: если в результате второго сложения перенос из 1-й тетрады отсутствует (см! — — 0), то из х," вычитается шесть (или прибавллегся 10 — ! — 6]л „).
При возникновении переноса из 1-й тетрады коррекция не выполняется, а полученный результат хз является истинным. При выполнении коррекции перенос из тетрады не должен изменять содержимое следующей тетрады суммы х,"+1. Рис. 3.6. Алгоритм сложения 2-10 чисел 3.5. Сложение и вычитание двоична-десятичных чисел 71 При побайтовой обработке длинных операндов в 8-разрядном процессоре микроконтроллера для исключения ошибок коррекцию необходимо выполнять отдельно для каждой тетрады. Пример. А = 50, В = 25. Найти сумму А+ В. Двоично-десятичное представление чисел А и В: А = 0101 0000, В = = 00! О 0101.
Складывая числа 66 + А + В, получаем 0110 0110 66 + 0 101 0000 50 1011 0110 Выполняем коррекцию младшей тетрвды: 110! 1011 +1111 1010 -$06 = $ГА 1101 0101 Выполняем коррекцию старшей тетрады: 1101 0101 + 1010 0000 — $60 = $АО 0111 0101 75 Программный код процедуры 2 — 10 сложения однобайтовых операндов приведен в программе 3.1. Вычитание беззнаковых чисел А — В можно выполнить по алгоритму, схема которого представлена на рис. 3.7: 1) выполняют вычитание А — В (складывая А с дополнительным кодом В), образуя первый промежуточный результат А'. Если в результате операции образуется перенос из старшей тетрады (при этом флаг заема равен 0), результат является положительным.
При отсутствии переноса (флаг заема равен 1) результат является отрицательным и его следует перевести в дополнительный код Я"; 2) коррекция положительного результата осуществляется по правилу, сформулированному для сложения 2 — 10 чисел. Коррекция отрицательного результата выполняется иначе: если произошел перенос из 1-й тетрады (флаг межтетрадного заема равен 0) при вычитании А — В, то из 1-й тетрады В;" вычитается шесть. При выполнении коррекции перенос из тетрады не должен изменять содержимое следующей тетрады промежуточного результата. 3. Арифметическая ойрайотка банных 3.б.
Программирование арифметических операций 73 3.6. ПРОГРАММИРОВАНИЕ АРИФМЕТИЧЕСКИХ ОПЕРАЦИЙ Рис. 3.7. Алгоритм вычитания 2 — 1 0 чисел Пример. А = 23, В= 62. Найти разность А — В. Двоична-десятнчное представление чисел А н В: А = 0010 0011, В = = 0110 0010.
Дополнение числа В: [В)„„= 1001 1110. Вычитая А — В = А + 1В)„, получаем л' 0010 0011 !001 1110 1100 0001 Переноса нет: результат отрицательный, флаг заема равен 1. Формируем дополнение !л'!д„п н выполняем коррекцию: 0011 1111 111! !010 -$06 = $РА 0011 100! Результат: флаг знака †, разность 39. Когда отрицательный результат требуется сохранить в дополнительном коде, шаг формирования дополнения ~В')деп опускается. Можно сразу переходить к коррекции (вычитанию шести в тех тетрадах, где не было переноса) Программный код процедуры 2 — 10 вычитания однобайтовых операндов для этого случая приведен в программе 3.1. Программа 3.1 *************************************в* к*** ь************* ;Тестовая программа 3.1 сложения и вычитания однобайтовых ;операндов .***************в***************************************** .1пс1нбе п8515бет.тпс" ;.1пс1нбе "т8515бет.ьпс" .бес ВСЭа =гЗС .бес ВСПЬ =г31 .бес страбб =г29 .бес гетр =г28 .сгд О г1п р ;Подпрограмма сложения 2-10 упакованных беззнаковых чисел ;ВСПа и ВСРЬ.
Результат возвращается в ВСПа, перенос — в ;всоь **а***********ь**********к** ********* * * ********* * ВСПабб: 1б1 абс! абб Гтрабб,866 ВСПа,ВСРЬ ВСВа,гтрабб Задание Е Ниже приведена тестовая программа 3.1 для проверки операций сложения и вычитания двоичных и двоичнодесятичных однобайтовых чисел в среде А ч'й Зшс11о 4.
Для двоичного сложения/вычитания числа можно задать со знаком и без знака. Двоично-десятичные числа представлены в упакованном формате без знака. Открыв А1гй Яиб)о 4, создать проект. Загрузить тестовую программу и, выполняя ее в пошаговом режиме, наблюдать результаты выполнения команд. Выполнить ряд примеров с разными значениями операндов. Чтобы не выполнять повторную компиляцию программы при изменении значений операндов, можно воспользоваться ручной перезагрузкой операндов в регистрах в окне Л'О. Для этого необходимо после команд занесения исходных значений операндов щелкнуть кнопкой мыши на соответствующем регистре в окне ВО и занести новое значение. 74 1с)1 1с)1 гса11 *** Яць 1с)г 1с)1 гса11 ВСоа,Б51 ВСОЬ,Я79 ВСОас)д ВСО Ппзьчпед ВСОа,972 ВСОЬ,Я28 ВСоз'Ь с1г ВСОЬ Ьгсз асЫ 0 асЫ 1 1с)1ВСОЬ, 1 Ьгпз ас)б 2 ВСОа,ЯОб зЬгз ВСЕЬ,О ;Результат: ВСОЬсВСОа=80130 гзщв ас)д 0: асЫ 1: 51хЬ1 асЫ 2: зцЬ1 1дх 1 с) 1 гса11 ВСОа,ЯОО ВСОЬ,Я90 ВСОзцЬ ВСОа,збО гзщр 1оор ВСОзцьы зцЬ ВСОа,ВСОЬ стг ВСОЬ Ьгсс зцЬ 0 ВСОЬ, 1 ;если флаг заема равен 1, 1бь зцЬ Ос зцЬР Ьгвс зцЬ 1 ВСОа,ЯО6 зЬгз ВСОЬ, 0 гес зцЬ..
ВСОа, Я60 гег 3. Арифметическая обработка д'анных ;установить выходной перенос ;если межтетрадный перенос равен О, 180 = ЬЯΠ— 6 ;если выходной перенос равен О, МЯО = МЯΠ— б ;Подпрограмма вычитания 2-10 упакованных беззнаковых чисел ;ВСОа и ВСОЬ (ВСОа — ВСОЬ). ;Результат возвращается в ВСОа,знак разности — в ВСОЬ -* **********х*х****** * * * ** ***** сохранить его ;если межтетрадный заем равен 1, ОБО = ЬЯΠ— б )если сохраненный флаг заема равен О, выйти, ;иначе вычесть 860 ***********************я***а********* ******************* ;Основная программа ****а****** *********** ********************************* твгтс 1б1 Гещр,то 01АМВНО) Оцс Ярь,сещр 1с)1 Сещр,вьчп)ВАМВНО) оцс ЯРН,Гещр С *** Асщ 81Н 1оорс 161 ВСОа,51 1с)1 ВСОЬ,-79 асЫ ВСОа,ВСОЬ ;Результат: ВСОа=ЯЕ4 ;*.* ЯцЬ Вти 1б ВСОа,72 1с)1 ВСОЬ,28 зцЬ ВСОа,ВСОЬ ;Результат: ВСОа=з2С :*** АсЫ ВСО Опеьчпес) 3.б.
Программирование арифметических операций 75 ;Результат: ВСОЬ=ЯОО-положительный,ВСОа=44 ;Результат: ВСОЬ=Я01-отрицательный, ВСОа=10 Задание 2. Изучить программу 3.2, приведенную ниже для исследования арифметических операций в стартовом наборе 8ТК500. Программой предусмотрен ввод кода операции, 8- и 1б-разрядных операндов, выполнение заданной операции и показ результатов. Поскольку в стартовом наборе 8ТК500 всего восемь кнопок общего назначения (8%7-8%0), отсутствие функциональных кнопок вызывает некоторые трудности. Чтобы обеспечить ввод 8-рязрядных чисел, поступим следую- им образом: кнопки 8%0— 8%3 будем использовать для ввода битов тесрады, 8%4 — для обмена мест амн младшей и старшей тетрады„8%5 — для записи байтов, 8%6 и 8%7— для показа байтов результата.
Таким образом, ввод чисел производится побайтно при наличии всего восьми кнопок. Выбор и исполнение арифметической операции происходит по значению кода операции, Вводимому первым, согласно табл. 3.1. Программа 3.2 ° * *********** *я** ***я * *** я***** ;Программа 3.2 — эмуляция арифметического устройства ;БНΠ— установка/сброс 0-го бита ;ЯИ1 — установка/сброс 1-го бита ;БИ2 — установка/сброс 2-го бита 3. Арифметическая обработка данных 76 3.б.
Программирование арифметических операций 77 ;БХЗ вЂ” установка/сброс 3-го бита ;ях4 — обмен местами младшей и старшей тетрад ;БХ5 — запись кода операции, двух (а при делении трех) байтов операнлов и выполнение операции при третьем нажатии кнопки (или 4-м при делении) ;БХб — показ байта суммы или разности, или младшей части произведения, или частного при делении ;ЯХ7 — показ байта признаков результата сложения или вычитания, или старшего байта произведения, или остатка при делении ;Соединения шлейфамис порт РВ-РЕР, порт РР-ЯХ ***************************я*******я*я************ч****** ;проверка кнопки ЯХб(ЯХ7) ;вывод на светодиоды задержка .
1пс1цбе ч 8515бе1. Тпс" ;.1пс1пбе "п8515беб.фпс" .беб Гепр = г1б .беб ян соб = г17 .беб орегапб = г18 .беб соцпг = г22 .беб соцпс Ьхс г23 ;установка указателя стека ч на последнюю ячейку ОБУ ;настройка цорта РВ на вывод снастройка порта РР на ввод ;очистка кода кнопки кнопка обмена ;очистка операнда 1ЯНЕО.Т=1 ;кнопка записи операндов ;кнопки просмотра результатов ссоппс=Ох11 — для обхода подпрограммы орех гопрос кнопок 0,1,2,3 РООРс Сеяс ян 0 Сеяс ян 1 геяг ян 2 сеяг ян 3 гса11 Геяс ЯХАР гса11 Геяс ХН ср1 соппг,О гЗпр сргфс Ь1б ян соб, 60 еог орегапб, ян соб соп орегапс) оцГ РОНТВ,орегапб соп орегапс( с1г ян соб гса11 РЕРАТ Ьгпе ЯХ ЯНОХ .беб сор = г24 .бег яепагог = г25 .бе1 ор А = г1 .бег ор В = г2 .бег ор АН = гЗ .бег пц1 1 г4 .беб пц1 Ь = г5 .бег гея = гб .беб япон1 - г19 .беб янон2 = г20 с***Выводы порта РР*** .ес(ц ЯХ БХАР = 4 .еао ЯХ ХН = 5 .ес(ц ЯХб = б .еЧп ЯХ7 = 7 .пасто геяг ян яЬТс РТНР, 80 чфайл определений для АТ90Я8515 ;файл определений лля АТпе9а8515 ;временный регистр ;код состояния замкнутой кнопки ;операнд ;счетчик ввода ;счетчик циклов умножения (деления) ;код операции чоперанд А ;операнд В ;старший байт делимого ;младший байт произведения ;старший байт произведения >частное ;1-й выводимый байт результата ;2-й выводимый байт ; проверка кнопки ЯХх (х=О, 1, 2, 3) ) и установка бита замкнутой кнопки ;переключение бита ;инвертирование для вывода на светодиоды ;инвертирование ;очистка кода кнопки ;задержка натг.
"яЬТя Р1НР, 60, г3пр на11 с(ц1г: пор .епбпасго Геяс ян .пасто Геяс звон яЬРс Р1МР, 60 гЗпр с(ц1Г соп 81 оцс РОНТВ, 81 соп 81 гса11 РЕРАУ натгс ябфя Р1НР, 80 г3'пр на11 с(п1Г: с1ор .епбпасго Геяг япон .ог9 ЯООО гОпр сп1с ;***Инициализация*** 1НТ Гепр,1он(РАНЕНО) опс БРР,Гепр Ь11 Сепр,Л19Ь(РАНЕНО опс БРН,Гепр яег сепр оцс РРНВ,Гепр опс РОНТВ,Сепр с1г гепр оцГ РРНР,Гепр яег Гепр оцс РОНТР,Гепр с1г ян соб с1г орегапб яег 1б1 яепагог,1 яег соппс сопрос кнопки обмена тетрадами ;опрос кнопки записи ;условие перехода к обработке операндов 3. Арифиетическая обработка данных ;вызов арифметической операции тса11 орет 101 зета ог, 1 вег саопс ЯХ ЯНОИ: Гевт впон гевт впон тЗшр ЬООР Яхб,зьон1 ЯИ?,вьон2 )Вызываемые подпрограммы ;******модуль арифметических операций ОРЕНс ср1 сор,1 ;анализ КОП Ьтпе Ь2 ;******Сложение или вычитание 8-разрядных операндов ас(с) ор А, ор В ЬО:шоч впон1,ор А гп вдон2,ЯНЕЯ апдг впои2,0хЬТ тес Ь2ссрь сор,2 Ьтпе ЬЗ впЬ ор А,ар В тЗшр ЬО ЬЗс срг сор,З Ьгс1е Ь4 ;******Модуль умножения с1т шц1 1 с1г шп1 Ь 161 соппт Ь11,8 Ь1:вЬтс ор В,О ас(с) шц1 Ь,ор А Ь4сср1 сор,4 Ьгпе Ь5 )******Модуль деления 16-разрядного числа на 8-разрядное ь2сгот пю1 Ь таг пп11 1 1вг ор В с1с ЬЗ: с)ес соцпт Ььт Ьгпе ь1 шоч впон1,шп1 1 шоч впон2,шц1 Л тег выводимые значения — сумма и признаки из регистра ВНЕС обнуление флага Т 8-разрядных операндов )очистка младшего байта произведения ;очистка старшего байта произведения ;счетчик циклов ;проверка младшего разряда множителя ;прибавление множимого А, если 80=1 ;сдвиг вправо двух байтов произведения ;сдвиг множителя вправо ;очистка флага С ;уменьшение счетчика циклов ;если не О, продолжаем умножение )выводимые значения — младший и старший байты произведения 3.