[an error occurred while processing this directive] [an error occurred while processing this directive]
Локальные переменные вообще располагаются в другом (+)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)
[an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive]

Отправлено Беня 27 февраля 2002 г. 12:32
В ответ на: Вопрос по KEIL. отправлено Игорь Е. 27 февраля 2002 г. 00:20

сегменте - в специальном сегменте для локальных переменных. Насколько я знаю, компилятор их располагает статически (например, в других компиляторах - во всех компиляторах для ПЭВМ) локальные переменные располагаются в стеке и причем "на ходу" - т. е. к ним обращение осуществляется, используя текущее значение стека - регистр SP. В компиляторах, где локальные переменные располагаются статически, размер сегмента для локальных переменных определяется линкером. Компилятор генерирует код, в котором нет конкретных адресов переменных, а линкер "прикидывает" какая фунция с каким количеством локальных переменных откуда вызывается (ведь одна и та же функция может вызываться и из main и из другой функции, которая тоже имеет локальные переменные) и вычисляет адреса для локальных переменных, которые и подставляет при генерации выходного кода. Статическое размещение компиляторов используется для компиляторов 51-х процессоров, для PIC - потому как если локальные переменные располагать на ходу в стеке, то придется для обращения использовать косвенную адресацию, которая при их архитектуре займет довольно много. Но минус такого подхода - нельзя использовать рекурсию (например, классический пример вычисления факториала с помощью рекурсии здесь не пройдет). Некоторые компиляторы имеют опции, при установке которой локальные переменные располагаются динамически в стеке - но код получается гораздо больше.
Например, IAR-ский компилятор для архитектуры AVR имеет специальный еще один добавочный стек для размещения локальных переменных и здесь уже рекурсия разрешена. Но AVR имеют другую архитектуру. Почему они не используют тот же стек, что и для адресов возврата программ я не знаю.
Для Keil можно написать программку с использованием локальной переменной и посмотреть в ассемблерном тексте, как осуществляется обращение. Но это довольно опасно - если компилятор при изменении оптимизации решит сделать эту переменную регистровой, то будут проблемы.

Кстати, как я погляжу, народ, используя язык Си, не особенно то и задумывается над такими вещами, как расположение локальных переменных и др., используя принцип "работает - ну и хорошо, а как - не мое дело" :-(

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

Ответы



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

E-mail: info@telesys.ru