Тупые вопросы по Ассемблерному языку (и не только)

Famouspilot
Famouspilot аватар
Offline
Зарегистрирован: 19.01.2016

В последнее время возникает много вопросов касательно структуры контроллера AVR, а также низкоуровневого проргаммирования. Решил создать топик здесь, дабы не флудить кучей никому не нужных обращений. Да и думаю, вам это тоже понравится.

Итак, начну излагать свои мысли. Первое: почему general purpose регистров - 32 (по крайней мере, в ATMega 2560 и ей подобных), а во всех примерах кода работа с регистрами начинается с r16?

Второе: инструкции RET и ей подобные загружают в программный счетчик то значение, которое было до вызова подпрограммы/прерывания? В таком случае, куда сохраняется текущее значение счетчика во время вызова подпрограмм/обработчиков прерываний? И объясняет ли тот факт, что обработчики и подпрограммы вызываются за пять тактов то, что необходимо сохранить текущее значение программного счетчика?

И, пожалуй, третье. 

in r16, SREG ; store SREG value
cli ; disable interrupts during timed sequence
sbi EECR, EEMPE ; start EEPROM write
sbi EECR, EEPE
out SREG, r16 ; restore SREG value (I-bit)
(Пример на стр.18 документации на ATMega2560-2561-1280-1281...)

Почему в данном случае копирование регистра SREG производится командами IN и OUT, а не, скажем, MOV или MOVW? В чем их отличия? В списке команд сказано о том, что дескать, IN и OUT занимаются переносом "портов", а MOV и MOVW работают только с регистрами. А разве SREG - не регистр?

Благодарю за взаимопонимание.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015