[an error occurred while processing this directive]
[an error occurred while processing this directive]
|
сегменте - в специальном сегменте для локальных переменных. Насколько я знаю, компилятор их располагает статически (например, в других компиляторах - во всех компиляторах для ПЭВМ) локальные переменные располагаются в стеке и причем "на ходу" - т. е. к ним обращение осуществляется, используя текущее значение стека - регистр SP. В компиляторах, где локальные переменные располагаются статически, размер сегмента для локальных переменных определяется линкером. Компилятор генерирует код, в котором нет конкретных адресов переменных, а линкер "прикидывает" какая фунция с каким количеством локальных переменных откуда вызывается (ведь одна и та же функция может вызываться и из main и из другой функции, которая тоже имеет локальные переменные) и вычисляет адреса для локальных переменных, которые и подставляет при генерации выходного кода. Статическое размещение компиляторов используется для компиляторов 51-х процессоров, для PIC - потому как если локальные переменные располагать на ходу в стеке, то придется для обращения использовать косвенную адресацию, которая при их архитектуре займет довольно много. Но минус такого подхода - нельзя использовать рекурсию (например, классический пример вычисления факториала с помощью рекурсии здесь не пройдет). Некоторые компиляторы имеют опции, при установке которой локальные переменные располагаются динамически в стеке - но код получается гораздо больше.
Например, IAR-ский компилятор для архитектуры AVR имеет специальный еще один добавочный стек для размещения локальных переменных и здесь уже рекурсия разрешена. Но AVR имеют другую архитектуру. Почему они не используют тот же стек, что и для адресов возврата программ я не знаю.
Для Keil можно написать программку с использованием локальной переменной и посмотреть в ассемблерном тексте, как осуществляется обращение. Но это довольно опасно - если компилятор при изменении оптимизации решит сделать эту переменную регистровой, то будут проблемы.
Кстати, как я погляжу, народ, используя язык Си, не особенно то и задумывается над такими вещами, как расположение локальных переменных и др., используя принцип "работает - ну и хорошо, а как - не мое дело" :-(
E-mail: info@telesys.ru