[an error occurred while processing this directive]
|
их не может использовать. А если и используются - то коряво.
Например я могу для 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