[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]

Отправлено просто так 19 сентября 2001 г. 12:41
В ответ на: а теоретицкий вопрос можна? и немнога ответ отправлено yes 19 сентября 2001 г. 12:01

а именно - "локальные переменные создаются в стеке" - верно для компиляторов, создающих код для персоналки. Там есть указатель стека -и размер для локальных переменных не вычисляется - локальные переменные размещаются тут же в стеке (сегмент для локальных переменных не создается, поэтому и не приходится вычислять его размер). Т.е. если Вы пишете прогу например на C для DOS и у вас есть функция
void f( void) {
unsigned char k ;
...
k = 5 ;
}
то доступ к локальной k происходит так :
mov bp,sp ; в регистр BP - загоняем текущее значение стека
sub sp,2
...
mov byte ptr [bp-1],5 ; заносим 5 в нашу локальную переменную

Для микро-ЭВМ (например, 51-х) - ситуация на корню другая!!!
Если Вы посмотрите листинг, то увидите, что текущее значение стека никак не используется для определения адреса локальной переменной.
Генерируется компилятором код типа MOV $НЕЧТО, 5
а линкер просчитывает размер сегмента локальных переменных, узнает адрес, который может быть использован, и при генерации кода уже заменяет $НЕЧТО на конкретный адрес.
Так что нельзя путать C для 386-го процессора для ПЭВМ и C для микро-ЭВМ. Кстати, советую, используя C, все-таки просметривать листинги, чтобы иметь хоть какое-то элементарное понятие о том, как происходит генерация кода и работа с локальными переменными. Ведь стыдно этого незнать - это азы.
А если в C для микро-ЭВМ вызывается функция косвенно по указателю, то приходится делать такую некрасивую штуку :
if( 0) f() ;
причем делать ее на том "уровне вызова", откуда вызывается ваша функция косвенно.
Вот так.


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

Ответы



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

E-mail: info@telesys.ru