我目前正在通过NASM汇编器学习汇编,卡在section和label之间的差异中。一世可以理解section .dat
,.bss
或.text
用作声明或初始化变量的标准,并从一开始类似于C中的main()
。而且,labes用于分配一个代码中的section。那么,这是什么晦涩的事实呢?
嗯,有一本不错的手册,你知道的。 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
或frooble_count dd 42
。 section .bss
用于未初始化的数据,它仅在内存中保留空间-不包括在磁盘文件中。您只能在此处使用“保留”伪指令-resb
,resw
,resd
等。其后的参数指示您要保留多少字节(等)。在-f bin
输出格式中,没有节/段(这就是使它成为“平面二进制”的原因)-Nasm只会先制作.text
,然后再移动.data
,最后才.bss
-您可以写'em以您想要的任何顺序。
标签未定义部分! Nasm只是将它们转换为数字-它们在您的代码中出现的地址-这就是您的可执行文件中显示的内容。您可以将标签用作变量名,也可以将其用作代码中可能要call
或jmp
的点。 Nasm都一样。一些汇编器“记住”您所说的变量的大小,如果您尝试使用错误的变量,它将抛出错误。 Nasm患有健忘症-您可以无投诉地进行mov [mybyte], eax
。有时这很有用,更多时候是错误。 “太大”的变量通常不是问题-“太小”的变量可能会导致错误,但通常要等到以后才会出现。很难调试!标签不能以十进制数字开头(数字必须以十进制数字开头)。以句点(点)开头的标签是本地标签。它的范围是从上一个非本地标签到下一个非本地标签。有关更多详情,请参见友好手册-这只是一个介绍。
“ main”一词对Nasm来说并不意味着什么,但是C知道(如果您要针对C进行链接)。一些编译器将其拼写为main
,一些编译器将其拼写为_main
。它是入口点-当控制权传递给程序时,执行开始。它不必是main_
中的第一件事-而是应该在该部分中,并且应声明为“ global”以告知链接器有关此信息。 “ _start”是Linux(等)的默认入口点。与“ main”不同,它不是section .text
,因此您不能从中call
。可以使用另一个名称,但是您需要告诉ld(ret
)。也应该是-e myentry
。
现在就足够了。请参见手册,如果还有其他问题,请返回(Ha!)。