|
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, 15:33
|
Участник

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

|
Цитата(_Pasha @ Jan 11 2011, 20:44)  Товарисч, arm-none-eabi-gcc-4.5.2.exe(т.е. то, чего советовали) это немного не arm-elf-gcc а вы товарисч предлагает использовать arm-none-eabi-gcc-4.5.2.elf?(линукс) И че как бы гсс не по стандартам еаби собирает? Де скачать на линукс? скачал первое что нашел гсс старый arm-unknown-linux-gnueabi-gcc-4.1.1 скомпилял и уррррраааа!!!! Почти :-D Получил на выходе 55.20001, че 1 в конце? :-D дайте ссылку пожалуйста, не могу найти ( Нашел arm-none-eabi последней версии, начал компилять, он ругнулся на конструкцию с asm("swi NUMBER"); В чем фишка? Код static inline long do_SWI0(const int swi_num ) { long ret_val;
asm volatile ( "swi %1 \n\t" \ "mov %0, r0 \n\t" \ : "=r" (ret_val) : "n" (swi_num)
: "r0", "r1", "r2", "r3", "ip", "lr", "memory", "cc" );
return ret_val; } include/swiadd.h: In function 'do_SWI0': include/swiadd.h:35:2: warning: asm operand 1 probably doesn't match constraints include/swiadd.h:35:2: error: impossible constraint in 'asm'
Сообщение отредактировал vova7890 - Jan 11 2011, 15:14
|
|
|
|
|
Jan 12 2011, 06:05
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(vova7890 @ Jan 11 2011, 21:33)  Получил на выходе 55.20001, че 1 в конце? :-D Почитайте про формат IEE754 и обратите внимание на столбец Decimal digits в строке binary32 и сходите по ссылке binary32.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
Сообщений в этой теме
vova7890 GCC перепутывает регистры на типе float Jan 10 2011, 19:03 rezident Приведенные фрагменты кода ничего не поясняют и ни... Jan 10 2011, 20:49   mdmitry Цитата(vova7890 @ Jan 11 2011, 16:19) cha... Jan 11 2011, 10:57    vova7890 Цитата(mdmitry @ Jan 11 2011, 16:57) скор... Jan 11 2011, 11:09 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
|
|
|