Это не ограничивается программами на ассемблере, это как формат исполняемого файла для вашей ОС, и большинство ОС решили иметь довольно обширный формат для исполняемых файлов, разделяя различные части программы на разделы («сегменты») .
Разделение исполняемого файла на различные разделы имеет несколько преимуществ, например, те, которые вы упоминаете:
.bss: Хранит информацию о памяти, которую необходимо обнулить при запуске программы. Память, которая должна быть обнулена, является обычной, и ОС обычно имеет специальные сервисы для раздачи обнуленной памяти, и если вам случается выделить глобальный массив размером 1 МБ, вам не нужно вставлять 1 МБ из 0 в исполняемый файл - вы можете просто закодируйте эту информацию в разделе .bss, и ОС выделит 1 МБ при запуске программы.
.data: это все ваши данные, которые при запуске программы инициализируются чем-то отличным от нуля.
.text: это фактический код
Там может быть еще много разделов, например, специальные разделы, содержащие код начальной загрузки, который необходимо запустить для инициализации программы, но который может быть удален после запуска, или разделы, содержащие отладочную информацию (которые не нужно загружать в память, если вы не запускаете программу в отладчике). Другой распространенный раздел - это раздел данных только для чтения:
.rodata: содержит недоступные для записи данные, например, все строки или константные данные в вашей программе.
Кроме того, ЦП могут применять защиту к памяти, например, читаемой / записываемой / исполняемой памяти. Наличие отдельных разделов позволяет легко применять эти защиты памяти. Например. код должен быть исполняемым, но наличие данных может быть плохой идеей.
Разделы, доступные только для чтения, также могут быть более легко распределены между другими процессами, разделы кода и памяти только для чтения могут совместно использоваться несколькими экземплярами программы. Если части текстового раздела необходимо поменять местами, их можно просто отбросить, так как они уже находятся в самом исполняемом файле, тогда как разделы data / bss не могут, их нужно поменять в специальную область подкачки.