-
- Я рассматриваю вопрос работы не компилятора исходников, а компоновщика объектных файлов (линкера). В различных скриптах для ld, предназначенных для компоновки кода под Cortex-M3, я встречал вызовы ALIGN(4)/ALIGN(8). Вот и возник вопрос: а почему мохоноги(252 знак., 15.08.2011 14:19)
- на практике ALIGN(8) встречается для работы с .data .bss, если проц умеет long long-ами (64 бит) работать, то процедуры инициализации (crt0 и т.п., что работает до вызова main()) обычно делают через ldd/std, соответственно нужно выравнивание на 8, ыыыы(268 знак., 15.08.2011 15:20, )
- Хотя, про "целиком на теории" это я слегка приврал. Проверено: данные размером в двойное слово считаются выровненными, если они выровнены по слову. По дальнейшему размышлению это кажется логичным (регистры у Cortex-M3 размером в слово, т.ч. мохоноги(180 знак., 15.08.2011 14:39)
- У меня было последствие: ф-ция printf() неправильно выводила float, когда указатель стека при её вызове не был кратен 8. Но это было на ARM7TDMI. - SciFi(15.08.2011 14:33)
- Нашёл тред в почтовой рассылке CodeSourcery о сходной проблеме (sprintf, float, указатель стека не кратен 8) с Cortex-M3. Запомню. мохоноги(1155 знак., 16.08.2011 20:20 - 21.08.2011 00:43, ссылка)
- printf("", (int)1, (float)2) и printf("", (float)1, ...) дадут положение аргумента типа float на стеке как раз на 4 байта выше-ниже. Т.е. если сбой возникает когда "не кратен 8" -- он будет возникать всегда и это никак не исправить пока fk0(289 знак., 15.08.2011 15:01)
- Да уже никто ту память не считает, а компилятор подавно - Vladimir Ljaschko(15.08.2011 23:05)
- сам - нет, вернее по-умолчанию обычно да, но это всё отключаемо - koyodza(15.08.2011 11:07)
- Я рассматриваю вопрос работы не компилятора исходников, а компоновщика объектных файлов (линкера). В различных скриптах для ld, предназначенных для компоновки кода под Cortex-M3, я встречал вызовы ALIGN(4)/ALIGN(8). Вот и возник вопрос: а почему мохоноги(252 знак., 15.08.2011 14:19)