Все остальное здесь Процессор Z80 имеет небольшое число регистров и ЕДИНОЕ адресное пространство.
Для выполнения операций над типами long и float регистров процессора недостаточно,
поэтому один из операндов должен размещаться в памяти. Для хранения этих операндов
в ОЗУ выделялись специальные ячейки под аккумуляторы данных типов (long и float).
Все константы этих типов размещались в программной секции $$INIT. Для выполнения
операций с данными этих типов (в том числе операций сравнения) генерировался вызов
служебных подпрограмм.
Процессор AVR имеет достаточное число регистров для размещения обоих 32-разрядных операндов,
поэтому константы сразу же размещаются в регистрах побайтно, им не нужно выделять оперативную память.
В случае использования типов long long и double, регистров процессора уже недостаточно для их размещения,
и для них требуется дополнительная память, примерно так, как сделал в свое время я сам для Z80.
Это первое предположение.
Далее, поскольку адресные простанства программ (ПЗУ) и данных(ОЗУ) разделены, то механизмы доступа
к константам и данных должны быть различны. Кроме того, поскольку для выполения операций над данными должны
вызываться соответствующие подпрограммы (это второе предположение), то они сделаны в предположении, что операнды
расположены в ОЗУ (как наиболее общий случай). Компилятор не различает мест размещения данных.
Поэтому вполне естественно, что все константы указанных типов должны при инициализации программы в startup
должны пересылаться в SRAM.
Третье (и последнее) предположение. Поскольку тип long long стал доступным только в последних версиях компилятора, то
можно надеяться, что в последующих версиях для работы с данными типа long long будут добавлены отдельные специальные
подпрограммы для работы с константами в программной памяти.
Еще раз подчеркиваю, что это только лишь мои предположения, не более.
-
- Весьма точные предположения. Спасибо! - IgorKossak(16.09.2004 12:18)