为什么装配程序有不同的部分?

Dav*_*ard 7 assembly

为什么汇编程序将段(.data/ .bss.text)加载到单独的内存块中,而不是将数据和代码段加载到单个内存块中?

我的猜测是操作系统可以移动段或以某种方式优化存储器以存储数据类型.思考?

nos*_*nos 12

这不仅限于汇编程序,它是如何布置操作系统的可执行格式的,并且大多数操作系统决定对可执行文件采用相当广泛的格式,将程序的各个部分分成几个部分("段").

在各个部分中分离可执行文件有几个优点,例如您提到的那些:

.bss:存储有关在程序启动时需要归零的内存的信息.需要归零的内存很常见,操作系统通常有特殊的服务来分配内存,如果你碰巧分配1Mb的全局数组,你不需要在可执行文件中嵌入1Mb的0 - 你可以只需在.bss部分编码该信息,操作系统将在程序启动时分配该1Mb.

.data:这是在程序启动时初始化为零以外的所有数据.

.text:这是实际的代码

可以有更多的部分,例如包含bootstrap代码的特殊部分,需要运行以初始化程序,但是一旦运行就可以丢弃,或者包含调试信息的部分(除非你运行,否则不需要加载到内存中)程序在调试器中).另一个常见部分是只读数据部分:

.rodata:包含不可写数据,例如程序中的所有字符串或常量数据.

此外,CPU可以对内存应用保护,例如可读/可写/可执行内存.具有单独的部分允许容易地应用这些存储器保护.例如,代码需要是可执行的,但让数据可执行可能是一个坏主意.只读部分也可以更容易地在其他进程之间共享,代码和只读存储器部分可以在程序的多个实例之间共享.如果需要交换文本部分的部分,它们可以被丢弃,因为它们已经驻留在可执行文件本身中,而数据/ bss部分不能,它们必须被交换到特殊的交换区域.