2

NASM 程序分为三个“部分”的技术原因是什么?.data、.bss 和 .text ?幕后究竟发生了什么?为什么汇编程序需要提前知道是否有常量,为什么不直接在程序运行时获取它们呢?

4

2 回答 2

3

首先,您并不总是需要使用这些部分。您可以在大量系统的数据部分中包含说明,在文本部分中包含数据。

不过,有一些很好的理由拥有它们。

  1. 如果您的操作系统和硬件足够复杂,您可以将某些页面映射为“不可执行”,这样您就可以提供一些保护,防止您意外跳入数据部分的错误。

  2. 同样,您可以将文本部分标记为“只读”,这样您就不会意外地使用错误的指针修改您的代码。

  3. 最后,bss 部分仅包含零初始化数据,因此在汇编时将其标记为这样可以减少可执行文件的大小 - 加载程序可以在跳转到程序之前仅 memset 正确数量的零,而不是占用一堆字节的存储只是为了保存一堆零。

于 2013-02-27T22:23:21.873 回答
0

我不能代表 NASM 的设计,但 .text、.bss 和 .data 这三个部分分别保存代码、初始化变量和未初始化变量,并在生成的二进制文件中使用适当的访问标志进行映射。

于 2013-02-27T22:22:34.070 回答