Распределение памяти сборки - PullRequest
13 голосов
/ 17 августа 2010

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

Все учебники, которые я смотрю, имеют переменные программ сборки, назначенные адресу памяти, например 0x0000, и я могу понять, что вы должны вручную назначать адреса памяти в сборке, но как узнать, какой адрес использовать?

Очевидно, что имеет смысл начинать с самого низкого возможного адреса памяти, но что, если переменная, которую вы назначаете, больше, чем объем памяти, доступный в 0x0000? Будет ли эта переменная иметь значение 0x0001 или 0x0002? Если это так, то это не испортит другие переменные, которым присвоены пробелы с похожей нумерацией (или вы не должны назначать их так близко)?

Если у меня две программы, написанные на ассемблере, запущенные одновременно (в современной ОС), и я использовал одинаковые адреса памяти в обеих программах, будет ли одна программа конфликтовать с другой, или ОС просто назначит доступную адрес памяти независимо от того, что на самом деле было написано в программе?

Любая информация по этому вопросу приветствуется.

Ответы [ 3 ]

19 голосов
/ 17 августа 2010

Ответом на вторую часть вашего вопроса (на большинстве современных ОС) является виртуальная память.

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

Каждый процесс получает свое собственное пространство виртуальной памяти.Таким образом, он может притвориться, что это единственный запущенный процесс, и у него тонны памяти.Затем каждый раз, когда вы обращаетесь к памяти, вы предоставляете виртуальный адрес, который сопоставляется с физическим адресом.Операционная система хранит таблицу того, какой виртуальный адрес сопоставлен с реальными физическими адресами в оперативной памяти.Обычно это делается с помощью некоторого специального оборудования (MMU, блок управления памятью) по соображениям производительности, но вы также можете сделать это на 100% в программном обеспечении.

Так что, когда вы говорите 0x000 в вашей программе, этовиртуальный адрес.Когда вы читаете или пишете, он переводится компьютером в физический адрес.Таким образом, в другом процессе тот же виртуальный адрес 0x000 отображается на другой физический адрес.Эта система позволяет вам писать свою программу, не зная точно, сколько ОЗУ доступно, или по какому адресу ваша программа будет загружена.Это также предотвращает стирание памяти вашей программой, принадлежащей другой программе.

Что касается первой части, то абсолютно.Различные типы данных занимают разные объемы памяти.Вы должны знать, сколько места вам нужно, когда вы размещаете свои структуры данных.Есть также проблемы с выравниванием байтов.Многобайтовые типы данных (например, числа с плавающей запятой) часто должны начинаться с адреса, который делится на 2 или 4 или на количество байтов, необходимое для хранения числа с плавающей запятой - это требование процессора или оперативной памяти.Таким образом, вы не можете просто сжать все свои данные, один байт за другим, вы должны расположить их в определенном порядке, например, собрать кусочки головоломки, если хотите минимизировать неиспользуемую память.

5 голосов
/ 17 августа 2010

Это не совсем ответ, но в этой книге есть ответ. Я могу только рекомендовать это. Он научит вас основам, как следует из названия, это программирование с нуля.

ProgrammingGroundUp

1 голос
/ 17 августа 2010

Зависит от цели и типа памяти (ОЗУ, ПЗУ и т. Д.), О которой вы говорите.Если вы говорите об оперативной памяти небольшого встроенного проекта, у вас может быть несколько файлов для отслеживания, и в технических паспортах микросхемы будут указаны различные адреса областей памяти.В случае, когда есть несколько «модулей», вы должны использовать компоновщик, чтобы связать объектные файлы в исполняемый файл.Компоновщик может переназначить адрес памяти, чтобы он не перекрывался, или у вас может быть центральный файл, в котором определены все области памяти, а другие модули используют его в качестве ресурса.Сожалею.Это большой вопрос с множеством ответов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...