[an error occurred while processing this directive]
Ответ: В том то и дело, что ничего не мешает. Тогда возникает вопрос - зачем нужны эти регистры, если часть команд
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)
миниатюрный аудио-видеорекордер mAVR

Отправлено Bill 08 июля 2002 г. 23:40
В ответ на: ну а что мешает "забыть" компилятору про r0-r15 отправлено yes 08 июля 2002 г. 19:41

их не может использовать. А если и используются - то коряво.
Например я могу для r16 написать команду загрузки константы
ldi r16, 0x80
а для r15 уже нет. Приходится изворачиваться
ldi r16, 0x80
mov r15, r16
И код вырастает, и быстродействие падает и потребность в ресурсах увеличивается. Кроме того, есть скажем команда "логического И" с непосредственной адресацией, а подобной командой для "исключающее ИЛИ" нет. То же самое - я могу написать
andi r16, 0x80
а если требуется выполнить "исключающее ИЛИ", то прийдется писать
ldi r17, 0x80
eor r16, r17
Ну и так далее. Если бы регистров было только 16, то они были бы равноправны, и все методы адресации были бы применимы ко всем операциям в равной степени.
Компилятор же просто сглаживает всю эту "корявость" и берет на себя всю рутину - где и какие регистры использовать и какие инструкции применять. Поэтому он использует в основном только верхнюю половину регистров, а нижнюю оставляет на крайний случай, когда переменных внутри функции объявляется слишко много. Если компилятор хороший, то нижние регистры выделяются под переменные, используемые в этой функции более редко, а под часто используемые переменные выделяются верхние регистры и код получается более эффективным.

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru