· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.RESEARCH —› Генерация кода для локальных переменных

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Сен 10, 2003 18:52:27 · Поправил: AsmGuru62

Вопрос знатокам компиляторов:
Я пишу на VC++ 6.0 и вижу странный код в прологе функции.
void foo ()
{
  CHAR s [4096];

  //...
}

Это вызывает странный CALL, который после манипуляций с
ESP, всё-таки делает 'SUB ESP,1000h' как и положено.
---
Вопрос: почему это надо и почему я не вижу простого:
sub esp, 1000h

как это сделано, если размер массива, скажем: "CHAR s[16]"?
P.S.: Это происходит в 'RELEASE Build'.


Дата: Сен 10, 2003 18:54:55

Если это под Debug - то там проверки на переполнение и т.п. Это под Release?


Дата: Сен 10, 2003 19:00:03

volodya
Это происходит в 'RELEASE Build'.


Дата: Сен 10, 2003 19:13:32

У меня в 2002 ключик есть - /GS - установлен даже в Release mode. Ты установки хорошо проверил? Ясно ведь, что это компилятор выпендривается.


Дата: Сен 10, 2003 19:24:48

Я ставлю /GS и он тут же исчезает после нажатия OK.
Да и вообще: я прочитал про /GS - он ставит DWORD 'guard' на локальные массивы, т.е. генерирует больший код.
Придётся, наверное, отказаться от крупных структур в стеке.


Дата: Сен 10, 2003 19:29:54

Смутно я припоминаю, что что-то такое писал Robbins. Попробуй, посмотри на MSDN... Что-то конкретно от меня нужно?


Дата: Сен 10, 2003 19:35:53

'Что-то конкретно от меня нужно?'
Да нет, вроде...
---
Я тут покопал GOOGLE немного. Похоже, что функция эта называется _alloca() и именно в случае достаточно большого локального массива компилятор сам вызывает её. Вопрос, как это поведение отключить?..
---
Спасибо, я поищу статью Robbins.


Дата: Сен 10, 2003 19:44:17 · Поправил: Dr.Golova

Лучше не отключать, а то так красиво упадет =)
Эта функция нужна для роста стэка - как известно поверх стэка стоит только одна страница с атрибутом PAGE_GUARD, так вот функция для больших массивов чекает размер выделяемой памяти под локальные переменные и последовательно перебирает каждую страничка, обращаясь к ней, что в свою очередь какраз и наращивает стэк. А если перескочить страницу с PAGE_GUARD получится обычный Access Violation.
А по поводу /Gs, в него кладется минимальный развер массиво после которого будет вызываться эта функция _chk_stk(), например /Gs8096 но как я уже намекал делать это следует только в том случае если ты хорошо понимаешь чем это может окончиться =)


Дата: Сен 10, 2003 19:56:49

Кажется понял: стек имеет 'allocated pages', но не все 'pages' являются 'commited'... я правильно понял?


Дата: Сен 10, 2003 19:58:58

Насколько я это дело понимаю - да. Джеффери Рихтер в своей книге это дело описывает. Если у тебя нет бумажной, вероятно, смогу подсобить с электронной :)


Дата: Сен 10, 2003 20:17:48

Да нет, не надо... я пороюсь на форумах, MSDN, etc...


Дата: Сен 10, 2003 20:23:52

AsmGuru62
стек имеет 'allocated pages', но не все 'pages' являются 'commited'
Вы что-то стек с heap'ом путаете.


Дата: Сен 10, 2003 21:33:19

Стек растет до лимита, отпущенного ему при компиляции, насколько я понимаю. Рост сопровождается движением страницы с PageGuard вниз в пространстве, отведенном стеку. А теперь пинайте меня, что я сказал не так.


Дата: Сен 11, 2003 00:55:18

Вот здесь говорится о том, на что ссылался Dr. Golova:

http://support.microsoft.com/default.aspx?scid=kb;en-us;100775
===
т.е. теоретически надо попробовать:
1. В .DEF файле: "STACKSIZE 262144,262144" (256Kb for now)
2. В опциях компилятора: "/Gs262144"
Сейчас попробуем!..


Дата: Сен 11, 2003 00:58:50

Quantum
Вы что-то стек с heap'ом путаете.
---
Да, вроде, не путаю...
В статье (см. выше) ясно сказано про стек, что он имеет 'reserved pages' и 'commited pages'.

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.068