[an error occurred while processing this directive]
[an error occurred while processing this directive]
|
Он организован по классической схеме - компилятор делает obj файлы, а линкер уже их слинковывает и проставляет адреса переменных. Проект может состоять из многих файлов у каждого из которых свои переменные, поэтому только линкер при связывании модулей может узнать, хватит ли в каком-то банке места или нет. Допустим, он видит, что не хватает и нужно было бы какую-то переменную поместить не в банк 0, а в банк 1. Но он уже ничего не может поделать - компилятор то не знал этого и сгенерировал код программы, в котором эта переменная в банке 0!
А, например, код для выражения "a = b ;" будет короче, если обе переменные в одно банке и длиннее, если в различных банках (т. к. нужно переключиться на нужный банк для переменной "a", прочитать ее, затем переключиться на банк для переменной "b"(это уже второе переключение) и только затем поместить в "b" результат. А если переменные в одном банке, то второе переключение делать не надо.
Поэтому линкер ничего поделать не может - он же не может "выкусить" лишний код или добавить свой в obj !
Автоматическое распределение переменных возможно только в системах (например, в дебильной глюкавой MPLABC), в которых вся программа должна быть в одном файле и там нет выделенного компилятора и линкера - а что-то смешаное.
E-mail: info@telesys.ru