Тупые вопросы по Ассемблерному языку (и не только)
- Войдите на сайт для отправки комментариев
В последнее время возникает много вопросов касательно структуры контроллера 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 - не регистр?
Благодарю за взаимопонимание.
Посмторите вот здесь