Распределение памяти сборки

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

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

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

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

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

13
задан ubiquibacon 17 August 2010 в 00:07
поделиться

3 ответа

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

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

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

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

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

19
ответ дан 1 December 2019 в 21:36
поделиться

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

ProgrammingGroundUp

5
ответ дан 1 December 2019 в 21:36
поделиться

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

1
ответ дан 1 December 2019 в 21:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: