ОПЕРАЦИИ НАД ЧИСЛАМИ С ПЛАВАЮЩЕЙ ТОЧКОЙ МК AVR

Март 17, 2011 от admin Комментировать »

Для выполнения арифметических операций над числами с плавающей точкой в микроконтроллерах необходимо разрабатывать довольно сложные подпрограммы. Исходные числа в формате с плавающей точкой представлены знаком, мантиссой и порядком. Мантисса является правильной дробью, разряды которой представляют значащие разряды числа, порядок показывает фактическое положение точки в записи мантиссы.

Для представления чисел с плавающей точкой разработан и введен стандарт IEEE-754, включающий базовый одинарный, базовый двойной, расширенный одинарный и расширенный двойной форматы, отличающиеся количеством разрядов и способами представления мантиссы и порядка. На рис. 3.8 приведена структура полей базового 32-разрядного одинарного формата. Формат содержит знаковый разряд S, 8-разрядное поле для смещенного порядка В и 23-разрядное поле для мантиссы F.

ОПЕРАЦИИ НАД ЧИСЛАМИ С ПЛАВАЮЩЕЙ ТОЧКОЙ МК AVR    mikrokont avrm image130 min vs

Рис. 3.8. Базовый одинарный формат

В этом формате при изображении порядка используется смещение, равное 127, скрытый бит целой части мантиссы Fq, содержащий 1. Минимальный (Е = 0) и максимальный (В = 255) порядки

зарезервированы для представления специальных чисел. Диапазон

± 38

представления чисел в этом формате составляет ±10 , а точность 6-7 десятичных разрядов. Приведем несколько примеров кодирования чисел в этом формате: ОПЕРАЦИИ НАД ЧИСЛАМИ С ПЛАВАЮЩЕЙ ТОЧКОЙ МК AVR    mikrokont avrm image132 min vs

В рассмотренных далее алгоритмах для 8-разрядных микроконтроллеров принимается представление истинного нуля нулевым набором (знак, порядок, мантисса). Специальные числовые значения из стандарта (на изображения бесконечности, неопределенности) учитывать не будем.

Во всех приводимых программах арифметических операций для микроконтроллеров AVR принято размещение исходных операндов и результатов во второй половине регистров общего назначения (R16…R31). Первый операнд, символически обозначаемый А, размещается в четырех регистрах А: рА (порядок), шАН, тАМ, rtiAL (старший, средний и младший байты мантиссы). Второй операнд, символически обозначаемый В, размещается в регистрах В: рВ (порядок), тВН, шВМ, mBL (мантисса). Результат помещается перед выходом из процедуры в регистры рА, шАН, тАМ, mAL.

Сложение

Процедура сложения чисел с плавающей точкой одного знака включает следующие действия:

•    определяется разность порядков слагаемых Ар = (рА – рВ). При неравенстве порядков, если разность порядков больше О, сдвигается мантисса числа В вправо до тех пор, пока порядок меньшего числа В не станет равным большему; если разность порядков меньше О, сдвигается мантисса числа А вправо;

•    после выравнивания порядков слагаемых при Ар = О производится сложение мантисс. В качестве порядка суммы принимается рА или рВ;

•     проверяется мантисса суммы на возможность нарушения нормализации. При сложении чисел с одинаковыми знаками возможно нарушение нормализации только влево на один разряд. Чтобы получить нормализованную мантиссу, необходимо сдвинуть ее вправо. Порядок увеличивается на единицу, что может привести к переполнению.

На рис. 3.9 приведена схема алгоритма сложения чисел А и В с плавающей точкой и одинаковыми знаками. Каждое слагаемое представлено однобайтовым порядком и трехбайтовой мантиссой в стандартном формате: знак числа, 8-разрядный смещенный порядок, 23-разрядная мантисса со скрытой единицей (всего 32 разряда). Число А перед началом операции размещено в регистрах рА, тАН, шАМ, mAL, число В – в регистрах рВ, рВИ, рВМ, pBL. Результат операции сохраняется на месте первого операнда А.

ОПЕРАЦИИ НАД ЧИСЛАМИ С ПЛАВАЮЩЕЙ ТОЧКОЙ МК AVR    mikrokont avrm image134 min vs

Рис. 3.9. Схема алгоритма сложения с плавающей точкой

Процедура сложения с плавающей точкой AddF начинается с проверки знаков слагаемых. Если знаки операндов не совпадают, знак второго операнда изменяется на противоположный и выполняется переход к процедуре вычитания чисел SubF. Если исходные операнды имеют один знак, каждый из них проходит проверку на равенство 0. Если один из операндов равен О, сложение не проводится, а результат принимается равным другому операнду. При этом в случае равенства О первого операнда регистры А и В обмениваются операндами. На этом операция заканчивается. Преобразование результата в стандартный формат не проводится.

Если оба операнда ненулевые, в однобитовом флаге Т регистра состояния микроконтроллера SREG сохраняется общий знак операндов и выполняется их восстановление из базового формата. Поскольку для этого используется одна и та же процедура гес из библиотеки вспомогательных процедур, настроенная на работу с регистрами А, перед вторым восстановлением проводится обмен операндами.

Далее вычитают порядки. При получении отрицательной разности выполняется обмен операндами и вычитание повторяется. При равенстве порядков, когда их разность Ар = О, выполняется переход к сложению мантисс. В противном случае предварительно разность Ар сравнивается с длиной мантиссы. Если разность превысит 24, то при выравнивании порядков со сдвигом вправо мантиссы меньшего числа она покинет разрядную сетку, происходит потеря значимости. В качестве результата принимается операнд, который в этот момент находится в регистрах первого операнда (рА, шА). Если разность меньше 24, переходим к сдвигу мантиссы меньшего числа, поместив ее в регистры (тАН, шАМ, mAL), разность порядков – в регистре рВ, меньший порядок – в регистре рА. Сдвиг мантиссы вправо сопровождается увеличением порядка в регистре рА, уменьшением в регистре рВ и продолжается до тех пор, пока в регистре рВ не получим 0.

Сложив побайтно мантиссы, проверяем признак переноса, который свидетельствует о нарушении нормализации. При отсутствии его (С = 0) выполняется переход к преобразованию числа в базовый формат. При С = 1 мантиссу суммы сдвигаем вправо и порядок увеличиваем на 1. Выполняем проверку переполнения. Если образовался порядок, равный О, это означает превышение максимального порядка 255. Программа завершается с установленным флагом переполнения С. Полученный в регистрах рА, шА результат считается неопределенным и не форматируется. При отсутствии переполнения флаг С сбрасывается и выполняется преобразование в базовый формат.

Алгоритм сложения чисел с одинаковым знаком представлен листингом программы 3.3. Программа позволяет выполнить алгебраическое сложение чисел с учетом знаков слагаемых. В том случае, когда слагаемые имеют разные знаки, происходит обращение к модулю вычитания. С помощью директивы .include "flsub.asm" подключают программный модуль вычитания чисел с плавающей точкой одинаковых знаков. Это позволяет в дальнейшем выполнить посредством одной и той же программы не только сложение, но и вычитание чисел.

В начале общей программы сложения;вычитания выполняют проверку кода выполняемой операции: 1 – для сложения (+), 2 – для вычитания (-). В зависимости от заданной операции и знаков операндов запускают процедуру сложения или вычитания беззнаковых чисел (табл. 3.4). При необходимости производится перемена мест операндов. В итоге можно применить одну из двух процедур: сложение или вычитание модулей чисел.

Таблица 3.4. Выполняемые операции

ОПЕРАЦИИ НАД ЧИСЛАМИ С ПЛАВАЮЩЕЙ ТОЧКОЙ МК AVR    mikrokont avrm image136 min vs

Программа 3.3

;Программа 3.3 сложения;вычитания чисел с плавающей точ- ; кой.

;Первый операнд находится в регистрах рА, гпАН, шАМ, mAL, ;второй – в регистрах рВ,тВН, тВМ, mBL. Результат ;возвращается в регистры первого операнда. При переполне- ;нии флаг С устанавливается в 1. Вызываемые процедуры

;расположены в файлах flsub.asm (модуль вычитания) и ;fllib.asm (библиотечные модули)

.include "8515def.inc" ;файл определений для AT90S8515 ;.include "m8515def.inc" ;файл определений для ATmega8515 .def temp = г1б                          ;временный регистр

.def асс = г17            ;регистр аккумулятор

.def сор = г18            ;код операции:

; 1 – сложение, 2 – вычитание .def рА = г20 ;операнд А (рА – байт порядка),

.def mAH = г21            ;(mAH, mAM, mAL – байты мантиссы)

.def mAM = г22 .def mAL = г23

.def pB = r24             ;операнд В (рВ – байт порядка),

.def тВН = г25            ;(тВН, тВМ, mBL – байты мантиссы)

.def тВМ = г2б .def mBL = г27

.org $000

Idi temp, low(RAMEND) ;инициализация указателя стека

out spl, temp

Idi temp, high(RAMEND)

out sph, temp

cpi cop,0x01              ;проверка кода операции

breq AddF rjmp SubF

;модуль сложения чисел с плавающей точкой ; с одинаковым знаком AddF: mov асс,рА eor асс,рВ brpl AddFl

Idi temp,0x80             ;изменение знака

add pB,temp rjmp SubF

AddFl: rcall cp_B_0       ;сравнение В с 0

breq Quit

rcall cp_A_0              ;сравнение A с 0

brne AddF2

rcall swapAB              ;обмен A и В

rjmp Quit

AddF2: bst pB, 7          ;сохранение знака Т=рВ.7

rcall rec                 ;восстановление

rcall swapAB              ; чисел через регистры A

rcall rec

mov acc,pA                ;вычитание порядков

sub асс,рВ

brpl AddF3         ;переход, если больше О,

rcall swapAB       ; иначе обмен и

mov асс,рА            ; снова вычитание sub асс,рВ

AddF3: breq AddF6     ;переход, если порядки равны

cpi асс,24            ;сравниваем brmi AddF4

rjmp AddF7         ;переход при потере значимости

AddF4: mov рА,асс     ;разность порядков в рА

rcall swapAB       ;разность теперь в рВ

AddFS: rcall shift    ;сдвиг в регистрах тА

inc рА             ;увеличиваем порядок меньшего числа

dec рВ                ;уменьшаем разность порядков brne AddFS

AddF6: add mAL,mBL        ;сложение мантисс adc mAM,mBM adc mAH,mBH

brcc AddFV         ;проверка нарушения нормализации

inc pA             ;корректируем порядок

breq Quit          ;выход с флагом переполнения

rcall shift        ;сдвиг мантиссы вправо

AddF7: rcall pack     ;форматирование результата Quit: rjmp Quit

.include "flsub.asm" ;подключение модуля вычитания .include "fllib.asm" ; и библиотечных процедур

Типовые процедуры, используемые алгоритмами сложения;вычитания, помещены в библиотеку, подключаемую директивой .include "fllib.asm". Библиотека fllib содержит процедуры восстановления операнда из базового формата гес, упаковки в базовый формат раек, обмен операндов swapAB, сдвига мантиссы вправо на один разряд shift, логического сложения 24-разрядной мантиссы для сравнения с нулем.

Восстановление числа из базового формата производится с помощью четырех операций, как показано на рис. 3.10, а. Вначале при помощи логического сдвига влево ф младший бит порядка из регистра старшего байта мантиссы шАН выталкивается на флаг переноса С. Затем выполняется циклический сдвиг влево содержимого регистра порядка рА Благодаря этому 8-разрядный порядок полностью оказывается в регистре рА. Далее мантисса шАН сдвигается вправо @ и в разряд 7 регистра шАН восстанавливается скрытая 1

ОПЕРАЦИИ НАД ЧИСЛАМИ С ПЛАВАЮЩЕЙ ТОЧКОЙ МК AVR    mikrokont avrm image138 min vs

Рис. зло. Схема восстановления числа из базового формата {а) и преобразования в базовый формат {б)

Преобразование результата операции, помещаемого после обработки в регистры А, в базовый формат выполняется по схеме на рис. 3.10, б. Вначале сохраняем порядок рА в одном из регистров, например рВ ф. Затем знак результата, сохраняемый на флаге Т, переносим на флаг С Выполняя сдвиг вправо регистра порядка рА, вводим знак числа в разряд 7 регистра рА Передачу младшего бита порядка в старший разряд мантиссы шАН выполняем за два шага: сначала из разряда О регистра рВ в Т затем из Т в разряд 7 регистра шАН ® на место старшего разряда мантиссы.

Обмен 32-разрядных операндов в регистрах А и В осуществляется с использованием логической функции Исключающее ИЛИ. Действительно, получив сначала А <— А Ф В, выполняем далее В<-ВФАиА<-АФВ. Эти операции повторяют отдельно для каждого байта порядка и мантиссы (всего 12 операций). Используемые библиотечные процедуры с комментариями представлены в листинге программы 3.4.

Программа 3.4

;Модуль 3.4 библиотечных процедур fllib.asm

;Восстановление операнда из базового формата гес: Isl mAH   ;младший разряд порядка в С

го1 рА             ;восстановление порядка

Isr mAH            ;сдвиг вправо мантиссы

ori mAH, 0x80       ;восстановление скрытой 1

ret

;Упаковка в базовый формат раек: mov pb,pa     ;сохраняем рА

с1с

brtc m2            ;проверяем знак

sec

m2: ror рА                 ;вводим знак в рА.7

bst pb,0           ;младший разряд порядка

bid mAH,7          ; переносим в АН.7

ret

;Обмен операндов swapAB:

еог рА,рВ           ;обмен регистров

еог рВ,рА           ; рА и рВ

еог рА,рВ           ; за три операции

еог mAL,mBL еог mBL,mAL еог mAL,mBL еог тАМ,тВМ еог тВМ,тАМ еог тАМ,тВМ

еог тАН,тВН еог тВН,тАН еог тАН,тВН

ret

;Сложение для сравнения А(В) с О ср_А_0: mov асс,рА or acc,mAH or acc,mAM

or acc,mAL       ;при A=0 возвращает флаг Z=1

ret             ;при A^O – Z=0

cp_B_0: mov acc,pB or acc,mBH or acc,mBM

or acc,mBL       ;при B=0 возвращает флаг Z=1

ret             ;при     – Z=0

;Сдвиг вправо 24-разрядной мантиссы mA shift: Isr mAH ror mAM ror mAL clc ret

Вычитание

Операция начинается с проверьси знаков слагаемых (рис. 3.11). Если знаьси операндов не совпадают, знак вычитаемого изменяется на противоположный и выполняется переход к процедуре сложения чисел AddF. Если исходные операнды с одним знаком, каждый

ОПЕРАЦИИ НАД ЧИСЛАМИ С ПЛАВАЮЩЕЙ ТОЧКОЙ МК AVR    mikrokont avrm image140 min vs

Рис. 3.11. Схема алгоритма вычитания с плавающей точкой

проходит проверку на равенство 0. Если один из операндов равен О, вычитание не проводится, а результат принимается равным другому операнду, при необходимости корректируется знак результата.

Если оба операнда не равны О, в Т сохраняется знак уменьшаемого и восстанавливают оба числа. При этом восстановлению числа В предшествует регистровый обмен А<->В. Затем выполняют сравнение порядков. Если порядки равны, сравнивают мантиссы, при их равенстве результат операции считается равным 0. Выявляется большее число без учета знака, которое помещается в регистры В. Если при этом выполняется обмен регистров, то хранимый в Т знак меняется на противоположный.

Дальнейшие действия связаны с выравниванием порядков и сдвигом вправо мантиссы меньшего числа, которое находится в регистрах А. После выравнивания порядков выполняется вычитание мантисс и формирование результата в регистрах А. При вычитании мантисс с одинаковым знаком может возникнуть нарушение нормализации вправо, т. е. появление одного или нескольких нулей в старших разрядах мантиссы разности. Устранение нарушения нормализации выполняется путем сдвига мантиссы разности влево и уменьшения порядка результата рА на единицу при каждом сдвиге. Если при уменьшении порядка возникнет антипереполнение (при изменении порядка от минимально допустимого значения 0×00 к максимальному значению OxFF), выполняется выход из процедуры с установленным флагом С = 1 и возврат в головной модуль программы с неопределенным результатом. После устранения нарушения нормализации выполняется форматирование результата в регистрах А и выход из процедуры вычитания в основную программу.

Программа модуля вычитания, согласно описанному алгоритму, представлена в листинге программы 3.5. В ней, как и в предыдущем случае, использованы стандартные библиотечные процедуры для сдвига мантиссы, обмена операндов, преобразования форматов. Следует отметить, что использование команд с условным переходом, выполняемых по механизму относительной адресации, привело к необходимости выполнения длинных переходов за два шага: сначала на близко расположенную локальную метку QuitS, а затем с помощью команды безусловного перехода rjmp на метку выхода Quit.

Программа 3.5

;Программа 3.5 модуля вычитания чисел с плавающей точкой ;с одинаковым знаком выполняет вычитание из 1-го числа А,

;размещенного в регистрах (рА,тА), 2-го числа, размещенного ;в регистрах (рВ,МВ).

;Исходные операнды представлены в базовом формате. ;Результат операции возвращается в регистры 1-го числа ;(рА,тА) в базовом формате.

;Программный модуль размещается в файле flsub.asm и ;подключается к основной программе с помощью директивы ; .include "flsub.asm"

SubF: mov acc,pA          ;сравнение знаков чисел

eor асс,рВ brpl SubFl

Idi temp,0x80             ;при неравных знаках смена

add pB,temp               ;знака 2-го числа

rjmp AddF

SubFl: rcall cp_B_0       ;проверка В на 0

breq Quit

rcall cp_A_0              ;проверка A на 0

brne SubF2

rcall swapAB              ;обмен операндов

Idi temp,0×80

add pA,temp               ; со сменой знака результата

Quits: rjmp Quit

SubF2: bst pA, 7          ;сохранение знака в Т

rcall rec                 ;восстановление числа А

rcall swapAB              ;теперь в рА порядок 2-го числа

rcall rec                 ;восстановление числа В

mov асс,рВ                ;из порядка 1-го вычитаем

sub асс,рА                ; порядок 2-го

brne SubF3

ср mBH,mAH                ;при равенстве порядков

brne SubF3                ; сравниваем мантиссы

ср тВМ,тАМ

brne SubF3

ср mBL,mAL

brne SubF3

clr pA                    ;если числа равны,

clr mAH                   ; результат равен О

clr таМ clr mAL rjmp Quit

SubF3: brcc SubF4         ;переход, если 1-е число

; (оно в pB,mB) больше, rcall swapAB ; иначе обмен числами

brbc 6,s2                 ; и изменение знака в Т

rjmp s3 s2: set

rjmp SubF4 s3: clt

SubF4: mov acc,pB         ;снова вычитание порядков

sub acc,pA

breq SubF7             ;переход при одинаковых порядках

cpi асс,24 brmi SubF6

rcall swapAB           ;передача большего числа

; в (pA,mA) перед rjmp SubF9  ; форматированием результата

SubF6: rcall shift ;сдвиг мантиссы меньшего числа dec асс       ; в тА, пока

brne SubF6             ; разность порядков не равна О

;Вычитание мантисс и сохранение разности в тА

SubF7:     sub mBL,mAL

mov     mAL,mBL

sbc     mBM,mAM        ;вычитание с заемом

mov     mAM,mBM

sbc     mBH,mAH        ;вычитание с заемом

mov     mAH,mBH

mov     pA,pB          ;передача порядка результата в рА

SubF8: sbrc шАН,7         ;проверка нарушения нормализации

rjmp SubF9             ;переход, если нарушения нет,

dec рА                 ; иначе, не сдвигая мантиссу,

cpi рА,Oxff            ; проверяем антипереполнение,

sec                    ; заранее установив флаг в 1,

breq Quits            ;при антипереполнении выходим

; с флагом 1, иначе

Isl mAL                ; сдвигаем мантиссу шА влево го1 тАМ го1 шАН

с1с                    ; и сбрасываем флаг

rjmp SubFB             ;повторяем проверку

SubF9: rcall pack         ;форматируем результат

rjmp Quit              ;выход из процедуры вычитания

Следует заметить, что описанные здесь алгоритмы и программы сложения и вычитания не являются полностью оптимальными. Например, восстановленные операнды можно с учетом заданной операции и операндов представить в дополнительных кодах со знаковым разрядом; в дальнейшем проводить операции сложения мантисс в дополнительных кодах, исключив тем самым необходимость перестановки операндов (табл. 3.5).

Таблица 3.5. Операции в дополнительных кодах

ОПЕРАЦИИ НАД ЧИСЛАМИ С ПЛАВАЮЩЕЙ ТОЧКОЙ МК AVR    mikrokont avrm image142 min vs

В рамках практикума не предполагалось получение оптимального кода по времени исполнения и по размеру, а требовалось лишь достижение результативности алгоритмов. Тем не менее предложенные программные решения могут оказаться достаточно эффективными в целом ряде приложений.

Умножение

Алгоритм умножения чисел с плавающей точкой С = А

Практическая часть

Задание 1. Открыв AVR Studio 4, создать проект. Загрузить программу 3.3 для проверки операций сложения и вычитания чисел с плавающей точкой. Привести ряд примеров с разными значениями операндов, воспользовавшись ручной загрузкой операндов в регистры окна НО. Подобрать операнды с равными и максимально различающимися порядками. Выполнить операции, фиксируя время их исполнения.

Задание 2. Создать проект и загрузить программу 3.6 для умножения чисел с плавающей точкой. Привести ряд примеров с разными значениями операндов. Оценить время выполнения операции умножения. Заменить программу умножения программой деления 3.7 и проверить ее работу.

Задания для самостоятельного программирования

1.  Изменить модуль эмуляции арифметического устройства базовой программы, включив в него дополнительно одну из логических и(или) арифметических операций.

2.   Для микроконтроллера ATmega8515 проверить работу операций умножения по их описанию, открыв файл помощи по AVR Ассемблеру, используя команды меню: Help;A VR Tools User Guide. В окне Html Help щелчком открыть А VR Assembler, выбрать Parts и затем ATmega8515. Подробное описание каждой из команд умножения можно найти в разделе А VR Assembler;Instructions.

3.  Рассмотреть операцию умножения дробных чисел на примерах. Проверить результаты с помощью симулятора AVR Studio 4.

4.  Написать процедуру сложения (вычитания) 2-байтовых операндов для проверки с помощью STK500. Сформировать признаки результата, как признаки 2-байтовой суммы (разности).

5.   Написать макрос для двоично-десятичной коррекции при сложении, равноценный команде DA А в системе команд микроконтроллеров MCS-51.

6.  Написать процедуру сложения (вычитания) двух 4-байтовых упакованных двоично-десятичных чисел.

Оставить комментарий