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

问题描述 投票:0回答:1

我目前正在通过NASM汇编器学习汇编,卡在sectionlabel之间的差异中。一世可以理解section .dat.bss.text用作声明或初始化变量的标准,并从一开始类似于C中的main()。而且,labes用于分配一个代码中的section。那么,这是什么晦涩的事实呢?

assembly label nasm sections
1个回答
5
投票

嗯,有一本不错的手册,你知道的。 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-您可以写'em以您想要的任何顺序。

标签未定义部分! Nasm只是将它们转换为数字-它们在您的代码中出现的地址-这就是您的可执行文件中显示的内容。您可以将标签用作变量名,也可以将其用作代码中可能要calljmp的点。 Nasm都一样。一些汇编器“记住”您所说的变量的大小,如果您尝试使用错误的变量,它将抛出错误。 Nasm患有健忘症-您可以无投诉地进行mov [mybyte], eax。有时这很有用,更多时候是错误。 “太大”的变量通常不是问题-“太小”的变量可能会导致错误,但通常要等到以后才会出现。很难调试!标签不能以十进制数字开头(数字必须以十进制数字开头)。以句点(点)开头的标签是本地标签。它的范围是从上一个非本地标签到下一个非本地标签。有关更多详情,请参见友好手册-这只是一个介绍。

“ main”一词对Nasm来说并不意味着什么,但是C知道(如果您要针对C进行链接)。一些编译器将其拼写为main,一些编译器将其拼写为_main。它是入口点-当控制权传递给程序时,执行开始。它不必是main_中的第一件事-而是应该在该部分中,并且应声明为“ global”以告知链接器有关此信息。 “ _start”是Linux(等)的默认入口点。与“ main”不同,它不是section .text,因此您不能从中call。可以使用另一个名称,但是您需要告诉ld(ret)。也应该是-e myentry

现在就足够了。请参见手册,如果还有其他问题,请返回(Ha!)。

© www.soinside.com 2019 - 2024. All rights reserved.