реклама на сайте
подробности

 
 
> GCC перепутывает регистры на типе float
vova7890
сообщение Jan 10 2011, 19:03
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 19-11-10
Пользователь №: 61 026



Пишу на гсс 4.5.2.Кароче заметил что спринтф не правильно схавал флоат, я отдизасмил и сравнил с дизасмом иара

char s[56]={0};
sprintf(s, "%f", 55.2);

дизасм гсс:
Код
                MOV     R0, SP
                LDR     R1, =unk_4A6
                LDR     R2, =0x404B9999
                LDR     R3, =0x9999999A


дизасм иара:
Код
                LDR     R3, =0x404B9999
                LDR     R2, =0x9999999A
                MOV     R0, SP
                ADR     R1, dword_58


как видно регистры R2 R3 перепутаны.

LDR R2, =0x404B9999
LDR R3, =0x9999999A

LDR R3, =0x404B9999
LDR R2, =0x9999999A


Че делать?


Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
vova7890
сообщение Jan 10 2011, 23:48
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 19-11-10
Пользователь №: 61 026



Забыл сказать, функция sprintf является прошивочной и от компилятора не зависит

да и не только спринф, многие функции работаеют не так, ибо число другое получается

в буфере(gcc): 2D302E303030303030 (-0.000000)
в буфере(iar): 35352E323030303030 (55.20000)

Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 11 2011, 03:44
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE
б) передача параметров в функцию не описывается стандартом Си, а отдается на откуп конкретной реализации компилятора.
Для ARM существует стандарт на передачу параметров - EABI
QUOTE (vova7890 @ Jan 11 2011, 04:48) *
да и не только спринф, многие функции работаеют не так, ибо число другое получается
А ваш GCC поддерживает EABI? Возможно у вас старая версия, которая его не поддерживала? Какая версия компилятора, какая сборка? Компилятор какой командой вызывается - arm-elf-gcc / arm-none-eabi-gcc или еще какой?

P.S. а на безграмотное первое сообщение с понтами могли бы и не дождаться ответа.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
vova7890
сообщение Jan 11 2011, 10:19
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 19-11-10
Пользователь №: 61 026



Цитата(Сергей Борщ @ Jan 11 2011, 09:44) *
Для ARM существует стандарт на передачу параметров - EABIА ваш GCC поддерживает EABI? Возможно у вас старая версия, которая его не поддерживала? Какая версия компилятора, какая сборка? Компилятор какой командой вызывается - arm-elf-gcc / arm-none-eabi-gcc или еще какой?

P.S. а на безграмотное первое сообщение с понтами могли бы и не дождаться ответа.


И шож там такого безграмотного? Если вы невнимательно читали, то я тут при чем?
Видимо никто не читал первый пост, я ж написал GCC 4.5.2!
компиляю так:
arm-elf-gcc -c -msoft-float -mlittle-endian -mcpu=arm926ej-s -Os -I include -nostdlib -fwide-exec-charset=cp1251 main.c
ну и там линкер ещё..

Цитата(alx2 @ Jan 11 2011, 12:39) *
Это не имеет значения. Корректно написанный код на языке программирования должен давать верный результат при выполнении.


ага, я догадывался

Цитата(alx2 @ Jan 11 2011, 12:39) *
Можете привести исходный текст, который при компиляции IAR дает один результат, а при компиляции GCC - другой?


приводил уже, первый пост - невидимка.

char s[56]={0};
sprintf(s, "%f", 55.2);

Сообщение отредактировал vova7890 - Jan 11 2011, 10:54
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th July 2025 - 21:13
Рейтинг@Mail.ru


Страница сгенерированна за 0.01385 секунд с 7
ELECTRONIX ©2004-2016