Эти виды директив зависят от того, для какой архитектуры вы строите свою программу, и они выбирают, какой раздел памяти назначить для любого кода или данных, которые следуют.В конце концов, все это просто строка байтов.После того, как ваша программа собрана, символам / меткам будут назначены разные адреса памяти в соответствии с тем, в каком разделе они находятся.
.text
обычно выделяется в разделе только для чтения, наиболее подходящем для кодаожидается, что это не изменится.
.data
- это обычно доступный для записи раздел памяти.Я полагаю, что довольно часто вы помещаете вашу строку в .text
прямо рядом с данными кода, если не ожидается, что она изменится (или, возможно, архитектура имеет аналогичный сегмент только для чтения).Я бы сказал, что секция .data
даже избегает большую часть времени.Зачем?Поскольку секцию .data
необходимо инициализировать - скопировать из двоичного файла программы в память при запуске программы.Большинство данных, на которые ссылается ваша программа, могут быть доступны только для чтения, и любая память, которая им нужна для операций, обычно просто выделяется с сегментом .bss
, который выделяет часть неинициализированной памяти.
Есть некоторые преимуществасмешивание кода и данных в одном разделе, например легкий доступ к адресу данных с относительным смещением от регистра ПК (адрес исполняемого кода).Конечно, есть и недостатки: если вы попытаетесь изменить доступную только для чтения память, вы, по крайней мере, проигнорируете свои действия, и программа может вызвать исключение и сбой.Все они очень специфичны для архитектуры, и самая безопасная ставка - хранить код в сегментах, предназначенных для кода, и данные / распределения в сегментах, предназначенных для данных.
Все это очень специфично для целей вашей программы.Например, Game Boy Advance имел «медленную» область памяти 256 КБ, «быструю» область памяти 32 КБ, а затем область «ПЗУ» только для чтения (данные игрового картриджа), которая может составлять несколько мегабайт, и ассемблеры использовали ихразделы памяти:
.data or .iwram -> Internal RAM (32KB)
.bss -> Internal RAM uninitialized
.ewram -> External RAM (256KB)
.sbss -> External RAM uninitialized
.text or .rodata -> Read only ROM (cartridge size)
В качестве другого примера, SPC-700 (звуковой чип SNES) имел 64 КБ читаемой и записываемой памяти, которая использовалась для всего, но первые 256 байтов имели более быстрый доступ («нулевая страница»).В этом теоретическом случае .data
и .text
будут назначены на одну и ту же область памяти, то есть они не будут размещены на нулевой странице, и они оба будут использовать одну и ту же память.Там будет пользовательский сегмент для нулевой страницы, и разница между .text
и .data
будет очень небольшой - просто способ отличить, какие символы в собранной программе указывают на «данные», а какие символы указывают на программукод.