繁体   English   中英

NASM中装配中的截面和标签有什么区别?

[英]What is the difference between section and label in assembly in NASM?

我目前正在通过 NASM assembler 学习汇编,但我陷入了sectionlabel之间的区别。 我知道section .dat.bss.text被用作变量声明或初始化的标准,以及 C 中的main()等链接器钩子。而且,标签也用于在代码中分配一个部分 那么这背后有什么不为人知的真相呢?

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

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

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

“main”这个词对 Nasm 没有什么特别的意思,但对 C 来说是已知的(如果你链接到 C)。 一些编译器拼写main ,一些_main ,一些(OpenWatcom)甚至拼写main_ 它是入口点 - 当控制权传递给您的程序时执行开始。 它不需要是section .text的第一件事 - 但应该在该部分中,并且应该声明为“全局”以告诉链接器有关它的信息。 “_start”是 Linux(等)的默认入口点。 不同于“主”它不call编,所以你不能ret从它。 可以使用另一个名称,但您需要告诉 ld ( -e myentry )。 它也应该是global

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM