|
GCC перепутывает регистры на типе float |
|
|
|
Jan 10 2011, 19:03
|
Участник

Группа: Участник
Сообщений: 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 Че делать?
|
|
|
|
|
 |
Ответов
|
Jan 10 2011, 23:48
|
Участник

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

|
Забыл сказать, функция sprintf является прошивочной и от компилятора не зависит
да и не только спринф, многие функции работаеют не так, ибо число другое получается
в буфере(gcc): 2D302E303030303030 (-0.000000) в буфере(iar): 35352E323030303030 (55.20000)
|
|
|
|
|
Jan 11 2011, 03:44
|

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

|
QUOTE б) передача параметров в функцию не описывается стандартом Си, а отдается на откуп конкретной реализации компилятора. Для ARM существует стандарт на передачу параметров - EABIQUOTE (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)
|
|
|
|
|
Jan 11 2011, 10:19
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Jan 11 2011, 10:57
|

Начинающий профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648

|
Цитата(vova7890 @ Jan 11 2011, 16:19)  char s[56]={0}; sprintf(s, "%f", 55.2); скорректируйте до полного разжевывания компилятору: Код float a = 55.2; char s[50]; sprintf(&s[0], "%f", a); и проверить, что возвращает sprintf. А какая реализация sprintf поддерживается в вашей библиотеке?
--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
|
|
|
|
|
Jan 11 2011, 11:09
|
Участник

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

|
Цитата(mdmitry @ Jan 11 2011, 16:57)  скорректируйте до полного разжевывания компилятору: Код float a = 55.2; char s[50]; sprintf(&s[0], "%f", a); и проверить, что возвращает sprintf. А какая реализация sprintf поддерживается в вашей библиотеке? гсс разжовывать безтолку, он такой же самый сгенерил код. Оптимизатор то работает  Реализация спринтфа самая какая ни есть стандартная. Я ж говорю гсс не правильно передал параметры в функцию, поэтому такая лабуда...
|
|
|
|
Сообщений в этой теме
vova7890 GCC перепутывает регистры на типе float Jan 10 2011, 19:03 rezident Приведенные фрагменты кода ничего не поясняют и ни... Jan 10 2011, 20:49   _Pasha Цитата(vova7890 @ Jan 11 2011, 17:19) ком... Jan 11 2011, 14:44    vova7890 Цитата(_Pasha @ Jan 11 2011, 20:44) Товар... Jan 11 2011, 15:33     demiurg_spb Цитата(vova7890 @ Jan 11 2011, 21:33) Пол... Jan 12 2011, 06:05 alx2 Цитата(vova7890 @ Jan 11 2011, 07:48) Заб... Jan 11 2011, 06:39 vmp Может быть у gcc что-то в инклюдах про spintf проп... Jan 11 2011, 11:40 vova7890 нет, гсс`ые инклуды я поудалял и не использую,... Jan 11 2011, 11:56 vova7890 все, собрал свой гсс с таргетом arm-eabi все зараб... Jan 11 2011, 16:45
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|