1. Синтаксис ниже. Указывается количество байт. В данном случае - 128.
2. Не нужно ничего размещать "по определенному адресу" за крайне редкими и очень специфическими исключениями. Адрес выделенного пространства в ОЗУ - имя этого пространства. Линкер все за вас сделает.
Однако вы сами должны определить требуемый сегмент памяти. Для чего в секции выделения памяти есть определение сегмента:
Напомню, что только сегмент near может содержать переменные, которые доступны в прямой адресации, когда адрес операнда в ОЗУ находится в самой инструкции. Например
3. Константы во флеше так же размещаются в произвольном месте и доступ к ним производится по имени. Размер и формат константы вы указываете в начале каждой строки:
и так далее...
Код: Выделить всё
tabCRC:
.pword 0x00, 0x31, 0x62, 0x53, 0xC4, 0xF5, 0xA6, 0x97
.pword 0xB9, 0x88, 0xDB, 0xEA, 0x7D, 0x4C, 0x1F, 0x2E
.pword 0x43, 0x72, 0x21, 0x10, 0x87, 0xB6, 0xE5, 0xD4
.pword 0xFA, 0xCB, 0x98, 0xA9, 0x3E, 0x0F, 0x5C, 0x6D
.pword 0x86, 0xB7, 0xE4, 0xD5, 0x42, 0x73, 0x20, 0x11
.pword 0x3F, 0x0E, 0x5D, 0x6C, 0xFB, 0xCA, 0x99, 0xA8
.pword 0xC5, 0xF4, 0xA7, 0x96, 0x01, 0x30, 0x63, 0x52
.pword 0x7C, 0x4D, 0x1E, 0x2F, 0xB8, 0x89, 0xDA, 0xEB
.pword 0x3D, 0x0C, 0x5F, 0x6E, 0xF9, 0xC8, 0x9B, 0xAA
.pword 0x84, 0xB5, 0xE6, 0xD7, 0x40, 0x71, 0x22, 0x13
.pword 0x7E, 0x4F, 0x1C, 0x2D, 0xBA, 0x8B, 0xD8, 0xE9
.pword 0xC7, 0xF6, 0xA5, 0x94, 0x03, 0x32, 0x61, 0x50
.pword 0xBB, 0x8A, 0xD9, 0xE8, 0x7F, 0x4E, 0x1D, 0x2C
.pword 0x02, 0x33, 0x60, 0x51, 0xC6, 0xF7, 0xA4, 0x95
.pword 0xF8, 0xC9, 0x9A, 0xAB, 0x3C, 0x0D, 0x5E, 0x6F
.pword 0x41, 0x70, 0x23, 0x12, 0x85, 0xB4, 0xE7, 0xD6
.pword 0x7A, 0x4B, 0x18, 0x29, 0xBE, 0x8F, 0xDC, 0xED
.pword 0xC3, 0xF2, 0xA1, 0x90, 0x07, 0x36, 0x65, 0x54
.pword 0x39, 0x08, 0x5B, 0x6A, 0xFD, 0xCC, 0x9F, 0xAE
.pword 0x80, 0xB1, 0xE2, 0xD3, 0x44, 0x75, 0x26, 0x17
.pword 0xFC, 0xCD, 0x9E, 0xAF, 0x38, 0x09, 0x5A, 0x6B
.pword 0x45, 0x74, 0x27, 0x16, 0x81, 0xB0, 0xE3, 0xD2
.pword 0xBF, 0x8E, 0xDD, 0xEC, 0x7B, 0x4A, 0x19, 0x28
.pword 0x06, 0x37, 0x64, 0x55, 0xC2, 0xF3, 0xA0, 0x91
.pword 0x47, 0x76, 0x25, 0x14, 0x83, 0xB2, 0xE1, 0xD0
.pword 0xFE, 0xCF, 0x9C, 0xAD, 0x3A, 0x0B, 0x58, 0x69
.pword 0x04, 0x35, 0x66, 0x57, 0xC0, 0xF1, 0xA2, 0x93
.pword 0xBD, 0x8C, 0xDF, 0xEE, 0x79, 0x48, 0x1B, 0x2A
.pword 0xC1, 0xF0, 0xA3, 0x92, 0x05, 0x34, 0x67, 0x56
.pword 0x78, 0x49, 0x1A, 0x2B, 0xBC, 0x8D, 0xDE, 0xEF
.pword 0x82, 0xB3, 0xE0, 0xD1, 0x46, 0x77, 0x24, 0x15
.pword 0x3B, 0x0A, 0x59, 0x68, 0xFF, 0xCE, 0x9D, 0xAC
Использовать выделенные константы можно в любом месте кода - до и после выделения. Линкер вставит константы в той последовательности кода, в котором эти константы размещены в тексте исходника. Применять директиву .org для фиксации положения кода во флеше конечно можно, но очень не рекомендуется из-за особенностей работы линкера.
Синтаксис использования констант зависит от способа доступа к флешу как к данным.
Тут могут быть специфические нюансы семейств МК.
Типичный PSV доступ выглядит так (копирование таблицы во флеше в буфер таблицы в ОЗУ для ускорения доступа):
Время доступа к флешу как к данным зависит от семейства и чем быстрее МК, тем больше латентность этого доступа. Поэтому и было сделано копирование в примере.
Напомню, что самые супер-пупер технологии флеша обеспечивают скорость доступа не выше 40 MIPS, поэтому инструкции прозрачно кэшируются, а доступ к данным во флеше
приводит к "пузырькам" в конвейере.