А avr-gcc работает и во флеше в байтовой адресации. Так что для получения адреса *кода*, пригодного к icall/ijump - надо
делить байтовый адрес на два, что и делает pm() (но зато потом с первого взгляда понятно *зачем* делится)
ldi r16,lo8(pm(foo))
sts куда_надо,r16
ldi r16,hi8(pm(foo))
sts куда_надо+1,r16
foo:
...
ret
С winavr идут все info и tkinfo для просмотра. Каежтся, я это всё там видел (в расширениях для AVR).