Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа программы 
:(
    Опции темы
asmdzen
Дата 16.8.2011, 21:13 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



Цитата(Hagrael @  16.8.2011,  21:06 Найти цитируемый пост)
а сам базовый адрес указан в файле

в том то и дело что он не указан, система его выдает когда загружает бинарник в память.
PM MAIL   Вверх
rodnover
Дата 16.8.2011, 21:14 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 7.4.2009

Репутация: 2
Всего: 10



С ОС по умолчанию, но знаю, что билдер и делфи свой менеджер памяти используют.

Базовый адрес (получается виртуальный, обычно указывается 0x400000. С количеством нулей могу напутать) программы указывается в PE-заголовке. Какой там указан - с такого и будет грузится. То есть, базовый адрес - это просто значение, которое выбирается самой программой и от которой она начинает плясать.

Код

int *c; // &c будет показывать одинаковое значение (как смещение от базы), c содержать разные значения, как указатель на объект в куче.
void f1()
{
  int a;
}
void f2()
{
  f1();
}
int main()
{
  c = new int(5); ///
  f1(); // Адрес переменной a будет отличаться в этом месте  и
  f2(); // в этом, потому что при вызове функции f2 в стек еще занесется дополнительная информация.
}


Динамически созданные переменные могут распологаться в разных адресах кучи (int *c пример указателя на кучу).

Что в вашем понимании "автоматические переменные"?

Это сообщение отредактировал(а) rodnover - 16.8.2011, 21:16
PM MAIL   Вверх
Hagrael
Дата 16.8.2011, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 26.6.2011

Репутация: нет
Всего: нет



Цитата(rodnover @  16.8.2011,  21:14 Найти цитируемый пост)
Что в вашем понимании "автоматические переменные"? 

Автоматическая переменная - это переменная, которая располагается в стеке блока и удаляется при выходе из него. Это неправильное определение?

Цитата(rodnover @  16.8.2011,  21:14 Найти цитируемый пост)
С ОС по умолчанию, но знаю, что билдер и делфи свой менеджер памяти используют.

Ясно.

Цитата(asmdzen @  16.8.2011,  21:13 Найти цитируемый пост)
в том то и дело что он не указан, система его выдает когда загружает бинарник в память. 

Цитата(rodnover @  16.8.2011,  21:14 Найти цитируемый пост)
Базовый адрес (получается виртуальный, обычно указывается 0x400000. С количеством нулей могу напутать) программы указывается в PE-заголовке. Какой там указан - с такого и будет грузится

Кто из вас прав? smile

Натолкнулся на 2 новых вопроса:

Цитата(Hagrael @  16.8.2011,  19:21 Найти цитируемый пост)
10) Когда создается автоматическая переменная? В том месте, где программист ее объявил в коде или при входе в блок кода?


Цитата(Hagrael @  16.8.2011,  19:21 Найти цитируемый пост)
11) Блок кода ведь тоже помещается в стек? Т. е. когда программа доходит в функции до блока кода ({блок}), то она создает новую ячейку в стеке, которая характеризует этот блок?

Надеюсь, понятно изъяснился.

Это сообщение отредактировал(а) Hagrael - 16.8.2011, 21:24
PM MAIL   Вверх
rodnover
Дата 17.8.2011, 06:44 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 7.4.2009

Репутация: 2
Всего: 10



Цитата(Hagrael @  17.8.2011,  01:23 Найти цитируемый пост)
Автоматическая переменная - это переменная, которая располагается в стеке блока и удаляется при выходе из него. Это неправильное определение?

Я просто не встречался с таким определением. smile

Цитата

Кто из вас прав? 


Я вот что имел ввиду. Физический адрес, то будет разным, вот только есть ли простой способ получить его из программы? smile

http://www.wasm.ru/article.php?article=vgw03

База образа:

Цитата

Когда линкер создает экзешник, он предполагает, что файл будет промэппирован в определенное место в памяти. Этот адрес и хранится в данном поле, делая возможным определенную оптимизацию со стороны линкера. Если файл действительно промэппирован по этому адресу, код не нуждается в каком-либо патчении перед запуском. В экзешниках, компилируемых для Windows NT, база образа по умолчанию равна 0x10000, а для DLL он по умолчанию равен 0x400000. В Win9x адрес 0x10000 не может использоваться при загрузке 32-х битных EXE, так как он находится внутри региона, разделяемого всеми процессами. Из-за этого Микрософт изменил адрес базы по умолчанию на 0x400000.


10. Тут, вообще, много зависит от компилятора и параметров оптимизации. Например, при некоторых параметрах оптимизации одни и те же ячейки памяти будут использоваться для разных переменных.

11. Код распологается в сегменте кода (это отдельный сегмент), а в стек помещается адрес возврата из функции (попробуйте поизучать ассемблер). Вот первая ссылка из гугла http://www.insidepro.com/kk/144r.shtml

Это сообщение отредактировал(а) rodnover - 17.8.2011, 06:47
PM MAIL   Вверх
mes
Дата 17.8.2011, 08:17 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Hagrael @  16.8.2011,  18:21 Найти цитируемый пост)
10) Когда создается автоматическая переменная? В том месте, где программист ее объявил в коде или при входе в блок кода?

Цитата(rodnover @  17.8.2011,  05:44 Найти цитируемый пост)
10. Тут, вообще, много зависит от компилятора и параметров оптимизации. Например, при некоторых параметрах оптимизации одни и те же ячейки памяти будут использоваться для разных переменных.

грубо: у объекта(переменной) есть время жизни.. на это время он (и только он) занимает определенные ячейки памяти.. 

http://liveworkspace.org/code/a0a9ebcea644...dcb7012796df81b

Добавлено @ 08:20
пример показывает, что  в разные промежутки времени на одном адресе расположены разные объекты.. 
функция/блок кода знает смещение в стеке до нужной переменной, и поэтому ей не важно реальный адрес переменной.. 


Это сообщение отредактировал(а) mes - 17.8.2011, 08:21


--------------------
PM MAIL WWW   Вверх
rodnover
Дата 17.8.2011, 08:22 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 7.4.2009

Репутация: 2
Всего: 10



http://liveworkspace.org/code/e7691f4dd47c...8fa6e8b898da032

Вот я про такой пример имел ввиду. При некоторых опциях компилятора адрес будет одинаковым.

P.S. Сайт отличный. Вообще в восторге. smile
PM MAIL   Вверх
mes
Дата 17.8.2011, 08:30 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(rodnover @  17.8.2011,  07:22 Найти цитируемый пост)
Вот я про такой пример имел ввиду. При некоторых опциях компилятора адрес будет одинаковым.

вообще то в том примере он для всех тех переменных всегда будет одинаков smile

Добавлено @ 08:32
Цитата(mes @  17.8.2011,  07:17 Найти цитируемый пост)
ункция/блок кода знает смещение в стеке до нужной переменной, и поэтому ей не важно реальный адрес переменной.. 

кажется я понял, что тс непонятно и чего мы упустили..  
Hagrael, почитайте про регистры процессора, именно через них он узнает какой кусок кода выполнять и где начало данных конкретного блока/функций.. 

Это сообщение отредактировал(а) mes - 17.8.2011, 08:33


--------------------
PM MAIL WWW   Вверх
rodnover
Дата 17.8.2011, 08:36 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 7.4.2009

Репутация: 2
Всего: 10



Цитата

вообще то в том примере он для всех тех переменных всегда будет одинаков 

В примере из моего сообщения на сайте адреса неодинаковы. ;) Но при некоторых опциях будут одинаковы.


Цитата

Hagrael, почитайте про регистры процессора, именно через них он узнает какой кусок кода выполнять и где начало данных конкретного блока/функций..


Вот заставили человека ассемблер изучать, но мысль верная и полезная.
PM MAIL   Вверх
Hagrael
Дата 17.8.2011, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 26.6.2011

Репутация: нет
Всего: нет



Классная статья, rodnover! Правда описывает она мало, и после ее прочтения появилась уйма вопросов smile

Думаю, вначале следует разобраться только со структурой самого exe-файла, не же ли сразу переходить к заголовку. Буду читать.

Цитата(Hagrael @  16.8.2011,  19:21 Найти цитируемый пост)
10) Когда создается автоматическая переменная? В том месте, где программист ее объявил в коде или при входе в блок кода?

Цитата(rodnover @  17.8.2011,  06:44 Найти цитируемый пост)
10. Тут, вообще, много зависит от компилятора и параметров оптимизации. Например, при некоторых параметрах оптимизации одни и те же ячейки памяти будут использоваться для разных переменных.

Т. е. в стандарте не сказано, когда переменная должна создаваться - при входе в блок кода или же в том месте, где она создается в коде?

Цитата(rodnover @  17.8.2011,  06:44 Найти цитируемый пост)
11. Код распологается в сегменте кода (это отдельный сегмент), а в стек помещается адрес возврата из функции (попробуйте поизучать ассемблер). Вот первая ссылка из гугла http://www.insidepro.com/kk/144r.shtml

Вот я и думаю его поучить. Но у меня сейчас не так много времени. Хотя действительно надо бы постараться. Я почитаю про стеки вызовов функций.

Как я понял, автоматические переменные - это то же самое, что и локальные?


Цитата(Hagrael @  16.8.2011,  19:21 Найти цитируемый пост)
8) Бывают статические, динамические и автоматические переменные. Бывают ли еще какие-то, которые отличаются от этих по сроку жизни?

Цитата(Hagrael @  16.8.2011,  21:06 Найти цитируемый пост)
Цитата(rodnover @  16.8.2011,  20:54 )
4. Динамические объекты могут работать медленнее, в следствии каких-либо алгоритмов менеджера памяти, в то время, как на выделение объекта в стеке, фактически вызывают одну команду смещения указателя на верхушку стека. Но не думаю, что это замедление хоть сколько-то заметно.

Т. е. объекты могут быть автоматическими, да? 

Так "Да" или "Нет"?

Появился новый вопрос:
Цитата(Hagrael @  16.8.2011,  19:21 Найти цитируемый пост)
12) Объектный код - это по большей части исполняемый код? А линкер, выходит, просто подставляет нужные адреса переменным, и все? Если так, то в теории один и тот же линкер может отлинковать объектный код, сгенерированый разными компиляторами! В wiki просто прочел вот это:
Цитата(wiki)

Объектный файл содержит в себе особым образом подготовленный код (часто называемый бинарным), который может быть объединён с другими объектными файлами при помощи редактора связей (компоновщика) для получения готового исполнимого модуля, либо библиотеки.


Спасибо за помощь!
PM MAIL   Вверх
asmdzen
Дата 17.8.2011, 08:40 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



Цитата(Hagrael @  16.8.2011,  21:23 Найти цитируемый пост)
Кто из вас прав?

а Вы перезапустите пример mes'а и посмотрите как меняется адрес переменной. т.е. насколько я помню в заголовке PE указывается адрес куда программа хотела бы загрузится, а потом система уже сама определяет может она ее туда загрузить или нет.

Цитата(mes @  17.8.2011,  08:17 Найти цитируемый пост)
грубо: у объекта(переменной) есть время жизни.. на это время он (и только он) занимает определенные ячейки памяти..

да, но когда эта память выделяется для него, ведь IMHO писать все переменные в начале функции или по мере необходимости уже в коде - дает примерно тот же результат, т.е. место в стеке для всех переменных выделяется при входе в функцию, разница только в том что конструкторы будут вызываться уже там где объект был объявлен.
PM MAIL   Вверх
Hagrael
Дата 17.8.2011, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 26.6.2011

Репутация: нет
Всего: нет



Многие говорят: "Размер переменной зависит от платформы. Точных данных нет" etc. А от чьей платформы? Платформы разработки программы или же платформы пользователя? Как я понимаю, второе. Тогда, выходит, что всеми размерами переменных управляет Windows?

Добавлено через 2 минуты и 13 секунд
Цитата(asmdzen @  17.8.2011,  08:40 Найти цитируемый пост)
да, но когда эта память выделяется для него, ведь IMHO писать все переменные в начале функции или по мере необходимости уже в коде - дает примерно тот же результат, т.е. место в стеке для всех переменных выделяется при входе в функцию, разница только в том что конструкторы будут вызываться уже там где объект был объявлен. 

Ответ получен! smile 
PM MAIL   Вверх
mes
Дата 17.8.2011, 08:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(rodnover @  17.8.2011,  07:36 Найти цитируемый пост)
В примере из моего сообщения на сайте адреса неодинаковы. ;) Но при некоторых опциях будут одинаковы.

sorry,  этот пример не увидел.. 
и при каких же это  опциях два объекта с пересекающимсе временем жизни могут занимать один и тот же адрес ?! 




--------------------
PM MAIL WWW   Вверх
Hagrael
Дата 17.8.2011, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 26.6.2011

Репутация: нет
Всего: нет



Цитата(asmdzen @  17.8.2011,  08:40 Найти цитируемый пост)
а Вы перезапустите пример mes'а и посмотрите как меняется адрес переменной. т.е. насколько я помню в заголовке PE указывается адрес куда программа хотела бы загрузится, а потом система уже сама определяет может она ее туда загрузить или нет.

Хм. У меня тут в голове промелькнуло в голове: "А зачем вообще в файле указывается базовый адрес, если Windows его очень навряд ли даст? (а вообще, Windows на него внимание обращает?) И чем этот базовый адрес будет лучше того, что даст Windows?"
PM MAIL   Вверх
mes
Дата 17.8.2011, 09:11 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(asmdzen @  17.8.2011,  07:40 Найти цитируемый пост)
да, но когда эта память выделяется для него, ведь IMHO писать все переменные в начале функции или по мере необходимости уже в коде - дает примерно тот же результат, т.е. место в стеке для всех переменных выделяется при входе в функцию, разница только в том что конструкторы будут вызываться уже там где объект был объявлен. 

для стековых переменных память не выделяется вообще (она выделенна изначально для всего стека) ..

Добавлено @ 09:13
Цитата(Hagrael @  17.8.2011,  08:04 Найти цитируемый пост)
"А зачем вообще в файле указывается базовый адрес, если Windows его очень навряд ли даст?

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

Это сообщение отредактировал(а) mes - 17.8.2011, 09:13


--------------------
PM MAIL WWW   Вверх
rodnover
Дата 17.8.2011, 09:13 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 7.4.2009

Репутация: 2
Всего: 10



Цитата

Как я понял, автоматические переменные - это то же самое, что и локальные?

В контексте получается - да, тоже самое.

Цитата

Так "Да" или "Нет"?

Опять таки, в конексте - могут.

Цитата

Многие говорят: "Размер переменной зависит от платформы. Точных данных нет" etc. А от чьей платформы? Платформы разработки программы или же платформы пользователя? Как я понимаю, второе. Тогда, выходит, что всеми размерами переменных управляет Windows?


Windows, Linux, MacOS, тип процессора (16, 32, 64 битный) и так далее. smile

Цитата

и при каких же это  опциях два объекта с пересекающимсе временем жизни могут занимать один и тот же адрес ?! 


Если компилятор определяет, что переменная больше не используется, то он может начать в этой ячейке хранить другую переменную.

Цитата

Хм. У меня тут в голове промелькнуло в голове: "А зачем вообще в файле указывается базовый адрес, если Windows его очень навряд ли даст? (а вообще, Windows на него внимание обращает?) И чем этот базовый адрес будет лучше того, что даст Windows?" 


Сколько раз я проверял под отладчиком винда всегда выдавала мне тот адрес который указан в PE-заголовке. А вообще это просто точка отсчёта, для ориентации по памяти программы все смещения в программе (jmp, jz, jnz, call) указаны относительные. Некоторые защиты строятся на изменении этого адреса.

12. В принципе да, если у него будет одинаковый формат и одинаковые соглашения.

Это сообщение отредактировал(а) rodnover - 17.8.2011, 09:16
PM MAIL   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0840 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.