|
Непонятное значение, PPC405 (XPS 9.2) |
|
|
|
Jul 24 2009, 10:05
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата Для printf - нет. Во-первых, будет приведен к int'у. Курите передачу параметров в функции с (...) в параметрах. Цитата Ну и всяко в байт, пусть даже трижды неинициализированный, FFFF2744 не влезет Вы на тему посмотрели? Там тип проца указан. Регистры там 32хбитные. А вот в какой момент избавляться от мусора (т.е. вставлять расширение знака или просто and) - это уже компилятор сам решать должен. И в данном контексте смысла компилятору вставлять какое-либо приведение нету.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Jul 24 2009, 10:41
|

Местный
  
Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091

|
Цитата(tolik1 @ Jul 24 2009, 13:33)  Xuint32 d=0xFFFFFD00 + Data; xil_printf("LoadLastByte - %x; Data - %x\r\n",d,Data);
Вопрос: Если переменная Xuint8 Data - один байт, то почеу значение - FFFF2744? Как определен тип Xuint32? Очень похоже на несоответствие типа, требуемого строкой формата, реальному типу переменной d.
Сообщение отредактировал alx2 - Jul 24 2009, 10:46
--------------------
Всего наилучшего, Alex Mogilnikov
|
|
|
|
|
Jul 24 2009, 11:16
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(Rst7 @ Jul 24 2009, 16:32)  Неа. Он передает там нолики (т.к. это unsigned). Но, т.к. переменная неинициализированна, то он имеет полное право забить болт на этот and. Например, считая, что в регистр уже загруженно правильное значение, не превышающее 256 (если бы перед этим была загрузка непосредственного значения или LBZ из озу). При компиляции функции неизвестно, инициализированное будет передано значение или нет. Поэтому, по крайней мере при Xuint32 d=0xFFFFFD00 + Data; компилятор должен провести расширение Data до Xuint32. Я так думаю. А то, что вы пишете, очень напоминает работу IAR с bool из вот этой ветки. За единственным исключением - там программист применил хитрый финт ушами, чтобы добиться подобного. Поэтому я всё же версию с неправильной интерпретацией параметра printf. Ждём топикстартера  ЗЫ. И интересно на всякий случай посмотреть на объявление Xuint8. Вдруг это пресловутый uint_least8_t?
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jul 24 2009, 11:40
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата Я так думаю. К сожалению, гнуся, да еще и под PPC под рукой нет. Могу показать, как компилит аналогичный код IAR под ARM. Код void foo1(const char *, ...);
#pragma optimize=no_inline void foo2(char c) { unsigned int d=123; d=d-c; foo1("blabla",d,c); } Код SECTION `.text`:CODE:NOROOT(2) ARM // 135 void foo2(char c) // 136 { // 137 unsigned int d=123; // 138 d=d-c; // 139 foo1("blabla",d,c); foo2: MOV R2,R0 RSB R1,R0,#+123 LDR R0,??foo2_0 ;; `?<Constant "blabla">` B foo1 ;; tailcall DATA ??foo2_0: DC32 `?<Constant "blabla">` // 140 } Обратите внимание, несмотря на размер переменной 8 бит (char c), компилятор не собирается прочищать какие-либо битики. Просто так договоренно, что этим занимается вызывающая функция. Правда вот получить из IAR'а такое-же поведения, как и ожидаемое мной у гнуся, не получается - тот хоть и матом орет на неинициализированную переменную, но ноликом ее прочищает. Правда, на малых уровнях оптимизации он этого не делает, но зато втыкает and с мусорным регистром. В общем, тут все зависит от поведения компилятора при вызове функции с неинициализированным аргументом. Рубль за сто, что там гнусь с регистром, в котором происходит передача параметра, ничего не делает, что летит только мусор... Более точно нам может ответить топикстартер, показав асмовский листинг своего творения. Цитата ЗЫ. И интересно на всякий случай посмотреть на объявление Xuint8. Вдруг это пресловутый uint_least8_t? Кстати, тоже вариант
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Jul 24 2009, 12:28
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(Rst7 @ Jul 24 2009, 17:40)  К сожалению, гнуся, да еще и под PPC под рукой нет. У меня есть под арм (cortex-m3): Код uint32_t test2(unsigned char ch) { uint32_t d = 0x00DEAD00 + ch; return d; }
8000594: b2c3 uxtb r3, r0 8000596: 4801 ldr r0, [pc, #4] (800059c <test2+0x8>) 8000598: 1818 adds r0, r3, r0 800059a: 4770 bx lr 800059c: 00dead00 .word 0x00dead00 Гнусь таки чистит лишние битики. Цитата Правда вот получить из IAR'а такое-же поведения, как и ожидаемое мной у гнуся, не получается - тот хоть и матом орет на неинициализированную переменную, но ноликом ее прочищает. Правда, на малых уровнях оптимизации он этого не делает, но зато втыкает and с мусорным регистром. Ну это тоже вариант. Компилятор гарантирует, что в переменной char старшие биты нулевые. Это уже чёткая аналогия с тем bool. Но чтобы и не гарантировал и не чистил - это как-то коряво, имхо. Цитата Более точно нам может ответить топикстартер, показав асмовский листинг своего творения. Да, будем ждать
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|