2015-07-14 9 views
-1

Im пытается использовать AVR Studio для добавления двух 32-битных чисел с плавающей запятой. Я знаю, что мне нужно будет хранить 32-битное число в 4 отдельных 8-битных регистрах. Затем мне нужно будет добавить регистры вместе с флагом переноса. Это то, что у меня есть до сих пор. Im добавляет 5.124323 и 2.2134523.Добавить два 32-битных числа с плавающей запятой с AVR-Assembler

;5.124323 (01000000101000111111101001110100) 
;Store hex value (40A3FA74) 
ldi r21,$40 
ldi r22,$A3 
ldi r23,$FA 
ldi r24,$74 


;2.2134523 (01000000000011011010100100110100) 
;Store hex value (400DA934) 
ldi r25,$40 
ldi r26,$0D 
ldi r27,$A9 
ldi r28,$34 


;Add the corresponding bytes together including the carry flag 
add r21,r25 
adc r22,r26 
adc r23,r27 
adc r24,r28 

Это не кажется, чтобы дать мне правильный ответ ... Я уверен, что единственное, что неправильно здесь порядок регистров в последних 4-х строк кода. Или, может быть, функции add/adc также неверны. Может кто-то, пожалуйста, помогите мне с этим?

+3

вы выполняете _integer_ дополнение. Это не даст правильный результат для значений с плавающей запятой (40A3FA74 + 400DA934 == 80B1A3A8, который при интерпретации 32-битного поплавка -1.6313592E-38). – Michael

+0

Не добавляются инструкции 'add' и' adc' integer? –

ответ

0

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

Вам нужно выяснить формат чисел с плавающей запятой, прежде чем вы сможете реально подумать о том, как их добавить. Число с плавающей запятой обычно будет представлено с показателем, мантиссой и, возможно, знаковым битом. Эти вещи могут зависеть от того, какой именно компилятор вы используете и его настройки. Возможно, числа с плавающей запятой вашего компилятора соответствуют IEEE floating point standard. Или, если эти плавающие числа не поступают из какого-либо компилятора, то вы должны выяснить, какой код их создает и изучить этот код, чтобы вы могли знать, в каком формате они находятся.

Вы должны пересмотреть, действительно ли вам нужны числа с плавающей запятой , Возможно, целые числа достаточно хороши.

Если вам действительно нужны номера с плавающей запятой, попробуйте выполнить компиляцию программы на языке С, которая добавляет с плавающей запятой, а затем посмотрите на ее демонстрационный список как отправную точку.

+1

Рассмотрите также неподвижную точку (она намного быстрее и больше): просто целые числа, но когда вы печатаете, поместите точку в другое место.(не забудьте настроить после умножения и деления). –

+0

Да, арифметика с фиксированной точкой обычно подходит для большинства встроенных приложений. –

0

Большинство ЦП (включая AVR) не хранят информацию о типе, поэтому вы должны использовать разные инструкции для разных типов. add и adc для целых чисел и различные инструкции для с плавающей запятой.

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


Интересно, что вы можете использовать одно и то же дополнение для подписанного (2-го дополнения) и без знака. Но не то же самое размножаться или делиться.

-1

Я не предпочитаю преобразовывать его в шестнадцатеричный, а затем делить на байты. Хороший способ:

.EQU dwi = 5124323; define the constant 
LDI r21 ,LOW(dwi) ; The lowest 8 bits to R21 
LDI r22,BYTE2(dwi) ; bits 8 .. 15 to R22 
LDI r23 ,BYTE3(dwi) ; bits 16 .. 23 to R23 
LDI r24 ,BYTE4(dwi) ; bits 24 .. 31 to R24 

, и следующая переменная

.EQU dwj = 22134523 

LDI r25 ,LOW(dwj) ; 
LDI r26 ,BYTE2(dwj) 
LDI r27 ,BYTE3(dwj) 
LDI r28 ,BYTE4(dwj) 

И исправить дополнение следует начинать с самых низких байт (в данном случае r21 and r25), но вы начали с высоким (заказ Rigth к -Выберите)

add r21, r25 
adc r22, r26 
adc r23, r27 
adc r24, r28 

my recommends to read

 Смежные вопросы

  • Нет связанных вопросов^_^