Пример. Возьмем входной регистр асинхронного приемопередатчика UDR он
имеет адрес 0×0C(0х2С) в скобках указан адрес в общем адресном
пространстве.
1
2
3
4
5
6
7
R18,10 ; Загрузили в регистр R18 число 10. Просто так
OUT UDR,R18 ; Вывели первым способом, компилятор сам
; Подставит вместо UDR значение 0х0С
STS 0x2C,R18 ; Вывели вторым способом. Через команду Store
; Указав адрес напрямую.
Оба метода дают идентичные результаты. НО! Те что работают адресацией в
пространстве ввода-вывода (OUT/IN) на два байта короче. Это и понятно - им
не нужно хранить двухбайтный адрес произвольной ячейки памяти, а
короткий адрес пространства ввода–вывода влезает и в двухбайтный код
команды.
Правда тут возникает еще один прикол. Дело в том, что с каждым годом
появляются все новые и новые камни от AVR и мяса в них все больше и
больше. А каждой шкварке нужно свои периферийные регистры ввода-
вывода. И вот, дожили, в ATMega88 (что пришла на замену Mega8)
периферии уже столько, что ее регистры ввода-вывода уже не умещаются в
лимит адресного пространства 3F.
Вот и приплыли. И вот тут у тех, кто пересаживается со старых камней на
новые, начинаются недоуменные выражения — с чего это команды OUT/IN
на одних периферийных регистрах работают, а на других нет?
А все просто — разрядности не хватило.
А ядро то единое, его уже не переделать. И вот тут атмеловцы поступили
хитро — они ввели так называемые memory mapped регистры. Т.е. все те