Страница 1 из 1

Особенности выделения памяти при интерпретации

Добавлено: 30 июн 2009, 19:58
toper
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)

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

Re: Особенности выделения памяти при интерпретации

Добавлено: 01 июл 2009, 09:12
airyashov
учимся работать отладчиком

Re: Особенности выделения памяти при интерпретации

Добавлено: 01 июл 2009, 09:44
somewhere
Судя по листингу, адрес переменной С = 4373Ch (взято из опкода команды). Как таковая, память для глобальных переменных не выделяется, они находятся с самого начала непосредственно в ЕХЕ файле и загружаются в память вместе с образом исполняемого кода. Исключение составляют большие массивы, динамические массивы и объекты. Начальный адрес этого образа задается опциями проекта и обычно составляет 40000h. Таким образом глобальные переменные могут быть проинициализированы и их значения попадут непосредственно в ЕХЕ при компиляции. Локальные переменные в процедурах и функциях находится в кадрах стека, поэтому их начальная инициализация невозможна (хотя могли бы сделать такую возможность, но она избыточна)

Re: Особенности выделения памяти при интерпретации

Добавлено: 03 июл 2009, 14:03
toper
Большое спасибо за ответы.
Тему можно закрыть