EEPROM даже по чтению доступен только через достаточно сложный блок управления с собственным таймингом, регистрами и т.д. Чтение байта из EEPROM требует целой подпрограммы, занимающей минимум 10 тактов (см. ДШ), а чтение байта из Code Memory - всего одной команды lpm, выполняемой за 3 такта и не требующей никаких проверок, стробов и т.д.
Команда lpm удобная - можно, например, использовать автоинкрементную адресацию (lpm r7,z+) для считывания блока констант:
.equ numbytes = 48 ; Длина копируемого блока констант, байт
.dseg
rambuf: .byte numbytes
.cseg
table2ram:
ldi zl,low(2*table) ; Z = указатель на источник констант в Code Memory
ldi zh,high(2*table) ; (2*table - т.к. адреса в cseg считаются в словах, а не в байтах)
ldi xl,low(rambuf) ; X = указатель на приемник данных в RAM
ldi xh,high(rambuf)
ldi r18,numbytes ; Счетчик байт блока
t2rloop:
lpm r16,z+ ; Прочитать константу из Code Memory в r16 и увеличить указатель Z
st x+,r16 ; Записать r16 в RAM и увеличить указатель X
dec r18 ; Повторять до конца блока
brne t2rloop
ret
table: .db "This is an example bla bla bla"