2015-01-08 3 views
0

Когда я смотрю на архитектуру загрузки/хранения, где переменная в регистре хранится в памяти под определенным адресом. Как компилятор знает, по какому адресу переменная хранится в памяти для ее загрузки? У него должен быть стол где-то. Если да, то где хранится таблица?Хранение адреса переменной в памяти

+0

компилятор или операционная система? – Ahmad

+0

компилятор создает исполняемый файл из программы, операционная система отвечает за его выполнение. при двойном щелчке по файлу exe. Однако переводчики выполняют программу по строкам. – Ahmad

+1

Ваш вопрос непонятен. Что вы подразумеваете под «где»? Вы имеете в виду «что такое структура таблицы»? В общем, компилятор на этапе генерации кода отдельно хранит информацию о внешних статических данных, внутренних статических данных, функциональных параметрах и локальных переменных. У некоторых из них нет адреса вообще, потому что они расположены в регистры процессора. У некоторых есть адрес в стеке, т. Е. Смещение головы стека. Статические данные имеют «нормальный» адрес, но внешние данные не имеют значения до этапа связывания. –

ответ

1

Компилятор генерирует symbol table, где хранятся переменные программы. базовый индекс этой таблицы равен нулю, а адреса относятся к этой базе. (эта таблица является частью файла exe).

Когда операционная система выполняет exe-файл, она загружает таблицу символов в память, а затем назначает ей новый базовый адрес. (в зависимости от того, где он может найти пустое место для загрузки файла). Затем все адреса вычисляются относительно этого нового базового адреса. Фактически базовый адрес добавляется к их адресу в таблице символов (обычно регистр данных сегмента хранит этот базовый адрес)

Смежные вопросы