[uquote="КРАМ",url="/forum/viewtopic.php?p=4475327#p4475327"][uquote="ALEKS1102X",url="/forum/viewtopic.php?p=4475279#p4475279"]volatile const R1 __at(0x18D0) = 0x00AA;[/uquote]
Ты же ничего не изменил...
У него и без volatile все нормально работает.
Вопрос был про отсутствие абсолютного адреса.
А ты просто заменил символ @ на __at.[/uquote]
В адресе _ почти ничего :

если не считать что там была ошибка - адрес для пик16-18 в любом случае это не "uint8_t", и значение он собирался сохранить 16-ти значное ...
А вот после ... человек обращается к значению того адреса - младшего, ну в принципе - нормально ...
А вот дальше !!!

Он пытается считать старший байт ВОСЬМИ-битного регистра

Даже не так ! Там написана БЕЛЕБЕРДА

Есть желание (КРАМ), то расшифруйте - что там написано
А в остальном - ДА! - одно и то же
const uint8_t R1 @0x18D0=0xAA; - вот это ЧТО? По адресу 0x18D0 записать значение 0хАА ? правильно ?
ну понятно, что:
следующая команда будет корректной - будет считано 0хАА,
а вот следующая команда - это НЕЧТО!
В восьмибитный байт "ADRESH" загрузить 16-ти битную пародию .... константы, которая уже закончилась (она была восьмибитной) ... да там вообще не читаемо ....
Немного может не в тему, но чем отличается "@" и "__at() :
Я не уверен, что просто объявив адрес напрямую "@" - после компиляции - проц запустится ?!?
Просто к примеру, в том месте ПЗУ на данный момент находилась уже прошивка (некий код, который туда кинул ХС8) ...
Вот через "__at" я точно уверен, что МПЛАБ подвинется, а через прямую вставку адреса ... да хер его знает ...