|
Непонятное значение, PPC405 (XPS 9.2) |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 20)
|
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. Но чтобы и не гарантировал и не чистил - это как-то коряво, имхо. Цитата Более точно нам может ответить топикстартер, показав асмовский листинг своего творения. Да, будем ждать
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jul 24 2009, 13:31
|

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

|
Цитата(scifi @ Jul 24 2009, 18:54)  А я думаю иначе :-) В стандарте написано: "If an object that has automatic storage duration is not initialized explicitly, its value is indeterminate." Понять это можно по-разному. Но если это понимать так, что у однобайтовых аргументов функции при входе в функцию обязательно надо отсекать лишние биты, то это приведёт к менее компактному и более медленному коду. Кому это надо? Тому разгильдяю, который не хочет инициализировать переменные? Я думаю, не следует идти у него на поводу. Понимать это надо так, как написано. Значение неопределено. Но в том же стандарте гарантируется, что значения переменной char находятся в диапазоне CHAR_MIN...CHAR_MAX. Если компилятор, вне зависимости от инициализированности переменной, этого не обеспечивает, это - кривой компилятор. Как он это делает - это его личное дело. Но делать это он обязан. Цитата(Rst7 @ Jul 24 2009, 18:59)  Я именно так и написал. Потом, правда, зачеркнул, решил, что сильно грубо  Кстати, подход IAR-а не всегда выиграет. По идее, он должен отсекать лишние биты при каждой записи в переменную. Можно представить ситуации, когда такой подход проиграет отсечению при чтении. Не говоря уж о том, что отсечение при чтении надёжнее.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jul 24 2009, 13:36
|

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

|
Цитата Кстати, подход IAR-а не всегда выиграет. По идее, он должен отсекать лишние биты при каждой записи в переменную. Можно представить ситуации, когда такой подход проиграет отсечению при чтении. При записи в ОЗУ отсечение происходит автоматически. Кстати, как и при чтении. При регистровых операциях оптимизатор точно выбросит лишние отсечения, которые "не пляшут рояли". Цитата Можно представить ситуации, когда такой подход проиграет отсечению при чтении. Очень гипотетическая ситуация, в связи с тем, что количество записей обычно меньше количества чтений. Цитата Не говоря уж о том, что отсечение при чтении надёжнее. Не надо уподобляться Дохтуру. Он тоже тут измышлял, в каких битах надежнее данные хранятся... Забанили нафиг
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Jul 24 2009, 13:52
|

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

|
Цитата(Rst7 @ Jul 24 2009, 19:36)  При записи в ОЗУ отсечение происходит автоматически. Кстати, как и при чтении. При регистровых операциях оптимизатор точно выбросит лишние отсечения, которые "не пляшут рояли". Лишь на тех архитектурах, где есть побайтовый доступ к ОЗУ, не правда ли?  Цитата Очень гипотетическая ситуация, в связи с тем, что количество записей обычно меньше количества чтений. Согласен, потому и написал "можно представить", а не "часто встречаются"  Цитата Не надо уподобляться Дохтуру. Он тоже тут измышлял, в каких битах надежнее данные хранятся... Забанили нафиг  Ну, я надеюсь, что я немного более вменяем  Я имею в виду, что отсечение при чтении защитит от ситуаций, когда хитрый программист записал что-то в переменную через указатель. Что до меня лично, я бы не прочь иметь в ГЦЦ ключик, включающий такую оптимизацию
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jul 25 2009, 18:16
|

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

|
Цитата Лишь на тех архитектурах, где есть побайтовый доступ к ОЗУ, не правда ли? Вы много знаете архитектур с отсутствием такового? Цитата Я имею в виду, что отсечение при чтении защитит от ситуаций, когда хитрый программист записал что-то в переменную через указатель. Посмотрите, каким образом компилятор извлекает, скажем, байтовую переменную из ОЗУ в 32хбитных архитектурах. Например, для ARM он пользуется LDRB, что приводит к автоматическом маскированию старших бит. На PPC есть аналогичная команда LBZ. Вот я уже правда не помню (давно не брал я в руки шашек), на большом индейце всех времен и народов (680x0) команда загрузки байта из ОЗУ в регистр типа move.b (Ax),Dy кажется не приводит к прочистке старших бит, посему там надо использовать ext.b Dy после загрузки. Цитата Дык! Но и в неположенные старшие мальца попало И если компилятор работает исходя из предположения, что там нули, то будет ой Да откуда же возьмутся после загрузки с расширением (одной командой в ARM или PPC, или парой в 680x0) там не нули?
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|