Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Локальные переменные в процедурах

17K
01 марта 2007 года
Den76
4 / / 21.06.2006
Можно ли определить локальный сегмент данных для локальных перемен
ных процедуры c помощью директив опр. сегментов, или лок.переменны-
ми считаются только данные, размещённые в стеке ниже BP?
334
01 марта 2007 года
HexEdit
809 / / 27.07.2006
Локальный всмысле для одной функции?
Если да, то нет, локальными считаются переменные внутри одной функции (ниже BP/EBP)
17K
02 марта 2007 года
Den76
4 / / 21.06.2006
А сегмент-то данных для процедуры можно ли определить или только что в стек заносится, то и есть локальные переменные, и чтобы с ними рабо
тать, процедура должна обращаться к стеку?
349
02 марта 2007 года
Phantom-84
656 / / 27.10.2005
Можно, если нет рекурсии или просто повторной входимости, вот только нафига?
1.8K
02 марта 2007 года
k3Eahn
365 / / 19.12.2005
Den76
MASM
 
Код:
FooProc proc hWnd : DWORD, lpszMessage : DWORD
    .const
    szCaption db "Foo", 0
    .code
   
    invoke MessageBox, hWnd, lpszMessage, offset szCaption, MB_ICONINFORMATION
    ret

FooProc endp
Локальный для процедуры сегмент создать не получиться. Но для удобства можно писать так, как я написал выше. В данном случае, естественно, szCaption не будет являться локальной переменной. Она будет глобальной и будет находиться в секции .rdata. Но, повторюсь, это удобный способ объявления переменных в том случае, если необходима глобальная переменная, которая используется только в одной процедуре.
309
02 марта 2007 года
el scorpio
1.1K / / 19.09.2006
Цитата:
Но, повторюсь, это удобный способ объявления переменных в том случае, если необходима глобальная переменная, которая используется только в одной процедуре.


Это статическая переменная. А локальные формируются в сегменте стека :D

1.8K
02 марта 2007 года
k3Eahn
365 / / 19.12.2005
Цитата: el scorpio
Это статическая переменная. А локальные формируются в сегменте стека :D


Гы... В ассемблере, в частности в MASM, нет понятия статической переменной.
Это же не C или C++. И ЭТА переменная видна в других процедурах модуля.

ЗЫ Не хочу повторяться (в третий раз) - но ключевое слово здесь - удобство.

349
02 марта 2007 года
Phantom-84
656 / / 27.10.2005
k3Eahn, раз он говорит про BP и сегменты, то скорее всего речь идет о программе реального режима (V86), поэтому завести отдельный сегмент для локальных данных подпрограммы вполне реально, вот только непонятно, зачем это нужно, ведь в крайнем случае можно использовать для этих целей зарезервированный участок в основном сегменте данных.
1.8K
02 марта 2007 года
k3Eahn
365 / / 19.12.2005
Phantom-84
Дык и мне не понятно зачем может понадобиться отдельный сегмент для процедуры и почему не использовать один сегмент данных для всех процедур.

Цитата:

Можно ли определить локальный сегмент данных для локальных перемен
ных
процедуры c помощью директив опр. сегментов, или лок.переменны-
ми считаются только данные, размещённые в стеке ниже BP?

Насколько локален будет сегмент?
Насколько я понимаю, под директивами опр. сегментов подразумеваются директивы типа .data, которые "закрывают" предыдущий сегмент и обозначают начало другого сегмента.
Та же .data будет при каждом использовании начинать сегмент каждый раз с одним и тем же "именем". В конце концов сегменты с одинаковыми именами будут объединены в один сегмент.

261
02 марта 2007 года
ahilles
1.5K / / 03.11.2005
вопрос был:
Цитата: Den76
Можно ли определить локальный сегмент данных для локальных перемен
ных процедуры c помощью директив опр. сегментов, или лок.переменны-
ми считаются только данные, размещённые в стеке ниже BP?


ответ нет, т.е. можно но фактически это бесполезно потому, что данные всегменте .code можно будет изменить, а .data можно будет выполнить

334
02 марта 2007 года
HexEdit
809 / / 27.07.2006
[quote=ahilles]данные всегменте .code можно будет изменить, а .data можно будет выполнить[/quote]
Нет, нельзя!
Код можно только выполнять и читать, а данные - читать и записывать...
Посмотри флаги сегментов в PM.
А в реальном режиме - это и так можно.
27K
03 марта 2007 года
HexCode
1 / / 03.03.2007
смотря где используются локальные данные. в различных местах их могут обозначать как статистические. как в c++ например.
261
03 марта 2007 года
ahilles
1.5K / / 03.11.2005
Цитата: HexEdit
Нет, нельзя!
Код можно только выполнять и читать, а данные - читать и записывать...
Посмотри флаги сегментов в PM.
А в реальном режиме - это и так можно.


это получается чт оесли в процедуре 3 сегмента, то для одной процедурки будет создано 3 дескриптора, БРЕД!!!
короче это не надо!!!!!!!!!!!

334
03 марта 2007 года
HexEdit
809 / / 27.07.2006
[quote=ahilles]это получается чт оесли в процедуре 3 сегмента, то для одной процедурки будет создано 3 дескриптора[/quote]
Нет. Сегменты с одинаковыми именами и атрибутами объединяются в одну секцию. А вот уже для разных секций создаются отдельные дескрипторы.

[quote=ahilles]короче это не надо!!!!!!!!!!![/quote]
Согласен.
2аффтар: Юзай либо локальные переменные как обычно, в стеке, либо глобальные, в секции данных.
252
05 марта 2007 года
koderAlex
1.4K / / 07.09.2005
Цитата: Den76
Можно ли определить локальный сегмент данных для локальных перемен
ных процедуры c помощью директив опр. сегментов, или лок.переменны-
ми считаются только данные, размещённые в стеке ниже BP?


в языках высокого уровня локальные переменные - область стека .
в ассемблере можно использовать всё что угодно . надо только озаботится корректным выделением и освобождением памяти .

334
05 марта 2007 года
HexEdit
809 / / 27.07.2006
[quote=koderAlex]в ассемблере можно использовать всё что угодно . надо только озаботится корректным выделением и освобождением памяти .[/quote]
В любом случае они (что вне стека функции) уже будут считаться глобальными...
252
06 марта 2007 года
koderAlex
1.4K / / 07.09.2005
если под переменные я выделяю область памяти , а указатель передаю функции через стек , то они какие ? :)
334
06 марта 2007 года
HexEdit
809 / / 27.07.2006
Все равно глобальные, ибо сами переменные находятся в общей секции данных.
252
07 марта 2007 года
koderAlex
1.4K / / 07.09.2005
это условность .
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог