Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
toper
0 / 0 / 0
Регистрация: 30.06.2009
Сообщений: 4
1

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

30.06.2009, 19:43. Просмотров 964. Ответов 5
Метки нет (Все метки)

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

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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)

Прошу помощи у знающих людей
0
Миниатюры
Особенности выделения памяти при интерпретации  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.06.2009, 19:43
Ответы с готовыми решениями:

Особенности сегментной памяти
Всё интересует один вопрос из раздела основ. По идее понимание его приходит только с практикой. А...

Выбрать подходящую функцию выделения памяти (WinAPI)
Господа, помогите выбрать подходящую функцию. Задача следующая: пользователь вводит в EditControl...

Ошибка выделения памяти
.MODEL SMALL .STACK 100h .DATA a DW 8 b DW 1 c DW 4 d DW 6 .CODE START: mov ax,3

Ошибка выделения памяти при использовании OpenMP в связке с ITK (Teamcenter API)
Среда Visual Studio 2008 Отладки как таковой нет, все производится &quot;наживую&quot; в консоле, из-за...

Распределение памяти для выделения и освобождения блоков памяти внутри запрошенного пула
В программе малые&quot;дыры&quot; избегают,что нужно сделать что бы малые &quot;дыры&quot; не избегались.... #...

5
Goodwin98
2523 / 819 / 10
Регистрация: 31.05.2009
Сообщений: 1,672
01.07.2009, 16:14 2
Во-первых из данного листинга это не понять, во-вторых аддрес этот, скорее всего, будет меняться при любом изменении в программе( добавятся какие-то переменные, изменится их размер и/или тип и т.д).
Цитата Сообщение от toper Посмотреть сообщение
Необходимо понять как конкретно выделяется память под переменные и
Может в дельфи это и отличается, но обычно делается так.Если переменная глобальная и статическая, то она будет в секции данных программы, а если локальная, то создаться при входе в подпрограмму в районе стека, а при выходе он ее и затрет.

Добавлено через 20 часов 3 минуты 10 секунд
Глянул еще раз опкод команды. Судя по нему аддрес с в данномслучае будет 403737Ch
0
toper
0 / 0 / 0
Регистрация: 30.06.2009
Сообщений: 4
01.07.2009, 18:05  [ТС] 3
Получается, все переменные в данной программе глобальные и распологаеются где-то в сегменте данных программы? А [c] - это что - указатель на кусок памяти, выделенный под эту переменную?

Судя по нему аддрес с в данномслучае будет 403737Ch
Прошу прощения за нескромный вопрос: это откуда видно или как рассчитать?
0
Goodwin98
2523 / 819 / 10
Регистрация: 31.05.2009
Сообщений: 1,672
01.07.2009, 18:45 4
1. Похоже, что так, потому что к локальным обращаются не по прямому аддресу, а примерно так
Assembler
1
mov eax,[ebp+2c]
2.Собственно запись [c] добавлена отладчиком, для лучшего понимания, на самом деле, если убрать отладочную информацию, то будет что-то вроде
Assembler
1
mov eax,[40373C]
3. Берем опкод mov eax,[c] (он короче и проще понимается ) - это A1 3C 37 40 00.
В нем A1 - это код операции, а все остальное аддрес 0040373С, из-за особенностей процессора, записаный наоборот
1
Evg
Эксперт CАвтор FAQ
19638 / 7330 / 551
Регистрация: 30.03.2009
Сообщений: 20,498
Записей в блоге: 30
01.07.2009, 22:01 5
На будущее, когда делаешь такие эксперименты, то делай узнаваемые константы. Например, пиши "a := 0x11112222", а такую константу в коде гораздо легче зацепить глазами, а дальше просто смотришь, куда попало её значение (т.е. в какой адрес памяти сбрасывается). Goodwin98, тебе уже объяснил, как это понимать

Если не секрет - а тебе зачем всё это?
0
toper
0 / 0 / 0
Регистрация: 30.06.2009
Сообщений: 4
03.07.2009, 13:57  [ТС] 6
Спасибо за ответы.
Тему можно закрыть
0
03.07.2009, 13:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.07.2009, 13:57

Утечки памяти без выделения памяти?
Человек использует _CrtDumpMemoryLeaks() для отлова утечек, и обратился ко мне в сязи с тем, что...

Ошибка выделения памяти
Добрый день , у меня проблема с выделением памяти 2-х мерному массиву. В общем такая конструкция....

Динамическое выделения памяти
Не совсем понимаю как работает данный кусок кода char *pchar = new char, c; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru