Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Особенности выделения памяти при интерпретации  (Прочитано 11228 раз)
0 Пользователей и 1 Гость смотрят эту тему.
noob
Гость
« : 30-06-2009 15:35 » 

Windows XP
В среде Borland Delphi 7 отключена оптимизация при генерации кода. Создано консольное приложение. Написана примитивная абстрактная программа

program Project1;
type
   a = array[1..2] of integer;
   b = array[1..10] of a;
var
   aa:a;
   bb:b;
   c, d, e, f:integer;
begin
   c := 5+3;
   c := c+4;
   d := c*3;
   aa[1] := 1;
   bb[1][2] := c;
   if (aa[1] < bb[1][2]) then
   begin
      aa[1] := aa[1] + 2;
      aa[2] := aa[1] - d;
      f := 6;
   end
   else
   begin
      bb[1][2] := d;
      f := 7;
   end;
   bb[5][2] := 5;
end.

На строке begin поставлена точка останова и запущено окно дебага процессора. Результат - на вложении.
Необходимо понять как конкретно выделяется память под переменные и, в частности, например, где лежит переменная С и какой у нее адрес (в листинге, например, строка: mov [c], $00000008)

Прошу помощи у знающих людей

* ass.JPG (95.43 Кб - загружено 893 раз.)
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 30-06-2009 15:54 » 

На все локальные переменные функций и процедур, память выделяется в стеке. На глобальные переменные, память выделяется глобально в одном месте. Как правило в exe эта область помечается .DATA. На все динамические создаваемые переменные. Сама переменная будет распологаться в куче. А ссылки на эту область. Там где определены.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
noob
Гость
« Ответ #2 : 30-06-2009 16:10 » 

И, все-таки, в строке "mov [c], $00000008" что такое в терминах ассемблера - "[c]" и где оно лежит? И как по данному листингу можно определить ее адрес?
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 30-06-2009 17:27 » 

Ну по тому листингу, что ты привел на картинке. Я думаю никто не определит Улыбаюсь. Так просто дебагер тебе показал, что запись будет производится в память, где расположена переменная c. У тебя она глобальна. Значит в область глобальных переменных.

PS. И кстати, у тебя оптимизация включена.
« Последнее редактирование: 30-06-2009 17:30 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
noob
Гость
« Ответ #4 : 03-07-2009 10:01 » 

Спасибо за ответы.
Тему можно закрыть
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines