[英]What is the difference between section and label in assembly in NASM?
我目前正在通过 NASM assembler 学习汇编,但我陷入了section和label之间的区别。 我知道section .dat
、 .bss
或.text
被用作变量声明或初始化的标准,以及 C 中的main()
等链接器钩子。而且,标签也用于在代码中分配一个部分。 那么这背后有什么不为人知的真相呢?
嗯,有一个很好的手册,你知道。 http://www.nasm.us如果你还没有得到它。
您使用的输出格式很重要 - -f
开关。 一般来说... section
和segment
是别名,它们做同样的事情。 它们不区分大小写,如果您愿意,可以使用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
部分用于未初始化的数据,它仅保留内存中的空间 - 不包含在磁盘文件中。 您只能在那里使用“保留”伪指令 - resb
、 resw
、 resd
等。它后面的参数表示您要保留多少字节(等)。 在-f bin
的输出格式不存在的部分/段(这是什么使得它“扁平二进制”) - NASM只是让.text
第一,移动.data
之后,和.bss
最后一个-你可以以任意顺序写“时间你要。
标签不定义一个部分! Nasm 只是将它们转换为数字——它们在你的代码中出现的地址——这就是你的可执行文件中出现的内容。 您可以将标签用作变量名称,或用作您可能希望call
或jmp
到的代码中的点。 纳斯姆也是如此。 一些汇编程序“记住”了您所说的变量的大小,如果您尝试错误地使用它,则会抛出错误。 Nasm 有健忘症——你可以mov [mybyte], eax
做mov [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.