【问题标题】:What is the difference between section and label in assembly in NASM?NASM 中的装配部分和标签有什么区别?
【发布时间】:2015-01-20 05:06:49
【问题描述】:

我目前正在通过 NASM 汇编器学习汇编,我得到了 卡在 sectionlabel 之间的区别中。一世 了解section .dat.bss.text 用作 声明或初始化变量的标准以及作为链接器挂钩 例如 C 中的 main()。而且,labels 用于分配一个 部分在代码中。那么这背后的隐晦真相是什么?

【问题讨论】:

  • A section 是与特定目的相关的内存区域,例如.text,用于可执行代码,或.rodata,用于只读数据(常量)。 标签是内存地址,指定内存中的变量,或扩展基本代码块的开头。
  • 如果我知道了,section 是与特定目的相关的预定义内存区域?

标签: assembly label nasm sections


【解决方案1】:

嗯,有一本很好的手册,你知道的。 http://www.nasm.us 如果你还没有收到的话。

您使用的输出格式很重要 - -f 开关。一般来说... sectionsegment 是别名,它们做同样的事情。它们不区分大小写,如果需要,可以使用 SEGMENT。大多数输出​​格式(不是-f obj)都有“已知名称”——.text.data.bss(还有更多)。这些区分大小写 - section .TEXT 可能无法满足您的要求。通常,section .text 是可执行的,但是是只读的。尝试写入它会导致分段错误(或任何 Windows 调用它 - GPF?)。 section .data 用于您的初始化数据 - msg db "Hello World!", 0frooble_count dd 42section .bss 用于未初始化的数据,它只在内存中保留空间 - 并且不包含在磁盘文件中。您只能在此处使用“保留”伪指令-resbreswresd 等。它后面的参数表示您要保留多少字节(等)。在-f bin 输出格式中,没有节/段(这就是使它成为“平面二进制”的原因)——Nasm 只是首先生成.text,然后移动.data,最后移动.bss——你可以写它们以任何你想要的顺序。

标签不定义一个部分! Nasm 只是将它们转换为数字——它们在你的代码中出现的地址——这就是你的可执行文件中出现的内容。您可以使用标签作为变量名,或者作为代码中您可能想要calljmp 的点。对纳斯姆来说都是一样的。一些汇编程序“记住”您所说的变量的大小,如果您尝试错误地使用它,则会引发错误。 Nasm 有健忘症——你可以毫无怨言地做mov [mybyte], eax。有时这很有用,更多时候是错误。 “太大”的变量通常不是问题 - “太小”的变量可能会导致错误,通常直到以后才会出现。很难调试!标签不能以十进制数字开头(数字必须以十进制数字开头)。以句点(点)开头的标签是本地标签。它的范围是从最后一个非本地标签到下一个非本地标签。有关(更多)详细信息,请参阅友好手册 - 这只是一个介绍。

“main”这个词对 Nasm 没有任何特殊的含义,但 C 知道(如果你链接到 C)。一些编译器拼写为main,一些编译器拼写为_main,一些(OpenWatcom)甚至拼写为main_。它是入口点 - 当控制权传递给您的程序时开始执行。它不需要是section .text 中的第一件事 - 但应该在该部分中,并且应该声明为“全局”以告知链接器。 “_start”是 Linux(等)的默认入口点。与“main”不同,它不是called,因此您不能从中获得ret。可以使用其他名称,但您需要告诉 ld (-e myentry)。也应该是global

现在就够了。请参阅手册,如果(哈!)您还有其他问题,请回来。

【讨论】:

  • 很确定bss 不是“未初始化”。它是隐式零初始化的,因为操作系统分配给程序的所有页面都被清零以防止一个程序读取另一个程序的旧数据。
  • 对。在 DOS .com 文件中 - 实际上没有任何“部分” - 您可以在 .bss 中设置一个值,结束程序,然后再次运行它而无需加载任何其他内容,然后找到您的值仍然存在。所以在那种情况下, .bss 是真正的“未初始化”。 DOS 在“安全性”方面不太好。在所有(?)其他情况下, .bss 由操作系统填充零。我不确定我们是否应该“指望”这一点,但这是真的。我试图保持简单。也许太简单了。谢谢指正!
  • NASM 的 bin 格式确实支持多个不同名称的部分,start=vstart=follows=vfollows=align=valign= 参数。
猜你喜欢
  • 2011-10-29
  • 2012-01-31
  • 2011-08-13
  • 2012-01-30
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 2023-03-13
  • 2010-12-28
相关资源
最近更新 更多