...делать нужно так, как нужно. А как ненужно - делать не нужно (С) Винни-Пух :)
-
- Так всегда и было в авровском асме, странно, что только наткнулся. В сях на усмотрение компилятора. Если надо подряд - то используешь структуру и прагму паковки. - Andreas(Сегодня, 08:53)
- Ассемблер так делал ещё в незапамятные времена. GCC (у меня старинный WinAVR 10-го года) - сам догадывается паковать последовательные строки в памяти. Насчёт "просто" констант - не подскажу, не требовались они мне. - Toчкa oпopы(Сегодня, 07:56)
- Давно не брал в руки шашек. У сабжевых процов вообще возможна ли побайтовая адресация к флешу? Он жеж вроде напрочь 16-битный? - LightElf(Сегодня, 04:42)
- да ну... есть DB, DW - всегда своя директива под разрядность. Я хз
за АВР, но мне кажется это глупостью... POV(95 знак., Сегодня, 00:24)
- Вопросы выравнивания были всегда, начиная с i8086. - vpv.vpv(Сегодня, 11:39)
- это мешает много где. Если размещаешь, к примеру, таблицу функций,
ну скажем состоящую из кусков, и если в каком-то куске - нечётное
количество точек, то получишь в этом месте "0". Очень неприятный
эффект :( или вот как у меня в данном примере: Adept(547 знак., Сегодня, 00:55)
- Размещай словами? И проблеме конец. Если в байт записать четыре
бита "0101" как "5", то запишется "0х05", при этом "А откуда взялся
старший ноль!?!" - что-то никто не возмущается. :))) - vpv.vpv(Сегодня, 11:43)
- да, технически всяко можно обойти. я вон, в итоге сделал одним ".db" и длиннющим списком с перегосом строк "\" - так визуально понятнее. Фэйл в том, что в массиве подряд идущих ".db" зачем-то делается выравнивание "до чётного" на каждом операторе, хотя нужно только на последнем. Понятно, что так проще, но, блин хоть бы какой варнинг выдавался, ан нет, - всё "молчком" :(( - Adept(Сегодня, 13:01)
- Размещай словами? И проблеме конец. Если в байт записать четыре
бита "0101" как "5", то запишется "0х05", при этом "А откуда взялся
старший ноль!?!" - что-то никто не возмущается. :))) - vpv.vpv(Сегодня, 11:43)
- да, так и есть, .DB, .DW, .DQ (подозреваю, что в настройках IDE или
опций компилятора где-то стоит "птичка" "выравнивать флеш-константы
по чётным адресам"... Но да, глупость какая-то. Обнаружил
соверщенно случайно на отладке в симуляторе :( - Adept(Сегодня, 00:25)
- Причем тут птичка? Флэш атмела - 16-битный. Читать можно и
побайтово, но писать только 16-битными словами. Команды тоже
состоят из 16-битных слов. Ассемблер не знает, что там в следующей
строке и что следующая строка вообще существует, и видя команду
.DB, дополняет данные до четного количества байт. Просто потому,
что иначе прошить невозможно. Следующую физическую строку его можно
заставить прочитать бэкслэшем, но следующую команду - нет. - Idler(Сегодня, 12:52 - 12:54)
- да разобрался, вчерась ещё :) спасибо всем понабежавшим с
камментами, если б вчера не разобрался, то это сильно помогло бы :)
Удивительно то, что при массиве ".db" происходить "выравнивание до
чётного" на каждом операторе :(( ничто не мешало бы ассемблеру
смотреть следующую строку при сборке. Неприятный недочёт, однако
:(( - Adept(Сегодня, 12:54)
- А чего тогда одну, а не 2, или вообще до конца файла?
avrasm/avrasm2 однопроходные, читают и ассемблируют по одной
ассемблерной строке из одного файла (все остальные включаются в
него инклудами, и обязательно до точки использования), линкера нет.
А вот GNUсный, вроде как двухпроходный, в нём и всякие
прагмы/атрибуты работают, и линкер есть. - Idler(Сегодня, 13:04)
- насчёт однопроходности не уверен. В исходниках, скажем п/п совсем не обязательно должны быть расположены вверх по тексту от точки их вызова, ссылки "вперёд" разрешены. Да и препроцессор AVRASM2 весьма продвинутый. Инклюды да, строго по очерёдности использования. Такое впечатление, что каждый файл обрабатывается в два прохода, а вот проект из файлов, собирается за один. - Adept(Сегодня, 14:10)
- А чего тогда одну, а не 2, или вообще до конца файла?
avrasm/avrasm2 однопроходные, читают и ассемблируют по одной
ассемблерной строке из одного файла (все остальные включаются в
него инклудами, и обязательно до точки использования), линкера нет.
А вот GNUсный, вроде как двухпроходный, в нём и всякие
прагмы/атрибуты работают, и линкер есть. - Idler(Сегодня, 13:04)
- да разобрался, вчерась ещё :) спасибо всем понабежавшим с
камментами, если б вчера не разобрался, то это сильно помогло бы :)
Удивительно то, что при массиве ".db" происходить "выравнивание до
чётного" на каждом операторе :(( ничто не мешало бы ассемблеру
смотреть следующую строку при сборке. Неприятный недочёт, однако
:(( - Adept(Сегодня, 12:54)
- Причем тут птичка? Флэш атмела - 16-битный. Читать можно и
побайтово, но писать только 16-битными словами. Команды тоже
состоят из 16-битных слов. Ассемблер не знает, что там в следующей
строке и что следующая строка вообще существует, и видя команду
.DB, дополняет данные до четного количества байт. Просто потому,
что иначе прошить невозможно. Следующую физическую строку его можно
заставить прочитать бэкслэшем, но следующую команду - нет. - Idler(Сегодня, 12:52 - 12:54)
- __attribute__((packed)) в объявлении переменной или ее типа, не помогает? - Nikolay_Po(Сегодня, 00:24)