Цитата(Палыч @ May 26 2015, 17:19)

Инженеры Atmel'а при проектировании микроконтроллеров AVR когда-то совершили стратегическую ошибку - отвели под область ввода-вывода слишком маленькое пространство адресов. Очень скоро количество регистров ввода-вывода в отдельных AVR стало превышать адресное пространство области ввода-вывода. Некоторые регистры ввода-вывода стали размещаться за пределами области ввода-вывода - команды IN/OUT для таких регистров применять нельзя.
В командах IN и OUT для адреса/номера регистра ввода-вывода есть всего лишь 6 бит. Именно потому эти команды не могут охватить более 64 регистров. К остальным же приходится обращаться (читать или писать), как к памяти, а не через инструкции IN и OUT.
Ругать инженеров Atmel'а за непредусмотрительность глупо, т.к. в одном слове больше места не выкроишь. Ведь там же еще и номер регистра общего назначения находится, в который IN читает, а OUT пишет.
Т.е. проблема тут отнюдь не в том, что памяти отвели мало, а в том, что в 16-разрядную инструкцию (тогда еще 32-разрядных не было) длинное число не засунешь. Тогда как для инструкций IN и OUT таких чисел надо сразу два.
Делать инструкции IN и OUT двубайтными "инженеры" остереглись, т.к. тогда бы и выполнялась такая инструкция за два такта, а не за один. А это могло стать очень существенной потерей для архитектуры AVR, т.к. свое место под солнцем она отвоевала именно благодаря выполнению большинства инструкций за 1 такт, чем и замогилила

51-ю архитектуру.
Кстати, раз уж разговор об этом зашел, замечу, что у Х-Мег (у которых разных регистров видимо-невидимо) есть, так называемый, "виртуальный порт". Это что-то вроде окошка, накладываемого на любой из портов, внутри которого действуют команды IN и OUT. Т.е. идея тут такова, что если требуется настолько быстрый ввод-вывод, что становится существенным, за сколько тактов он выполяется, то используемый порт совмещают с виртуальным, а дальше работают на вируальном порте однотактовыми командами IN и OUT.