我目前正在通过NASM汇编程序学习装配,我得到了
坚持部分和标签之间的区别。一世
了解section .dat
,.bss
或.text
用作
标准来声明或初始化变量并作为开始
比如C中的main()
。但是, labes 用于分配
代码中的部分。那么这个晦涩难懂的真相是什么呢?
答案 0 :(得分:4)
嗯,有一个很好的手册,你知道。 http://www.nasm.us如果你还没有。{/ p>
您正在使用哪种输出格式 - -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
,然后{{1}最后 - 你可以按照你想要的任何顺序写'em。
标签不定义部分! Nasm只是将它们转换为数字 - 它们在代码中出现的地址 - 这就是可执行文件中出现的数字。您可以将标签用作变量名称,也可以将代码用作代码中可能需要.bss
或call
的点。纳斯姆也一样。有些汇编程序“记住”你所说变量的大小,并且如果你试图错误地使用它会抛出错误。 Nasm有健忘症 - 你可以毫无怨言地做jmp
。有时这很有用,更常见的是它是一个错误。一个“太大”的变量通常不是问题 - 一个“太小”的变量会导致错误,这通常直到以后才会出现。艰难调试!标签不能以十进制数字开头(并且数字必须以十进制数字开头)。以句点(点)开头的标签是本地标签。其范围从最后的非本地标签到下一个非本地标签。有关详细信息,请参阅“友善手册” - 这只是一个介绍。
“main”这个词并不意味着对Nasm有什么特别之处,但是对C来说是已知的(如果你是与C联系的话)。一些编译器将其拼写为“main”,一些“(下划线)main”,一些(OpenWatcom)甚至拼写为“main(下划线)”。 (为什么我的下划线被吃掉?)这是入口点 - 当控制传递给你的程序时执行开始。它不需要是mov [mybyte], eax
中的第一件事 - 但应该在该部分中,并且应该被声明为“全局”以告诉链接器它。 “_start”是Linux(等)的默认入口点。与“main”不同,它不是section .text
,因此您无法call
。可以使用另一个名称,但是您需要告诉ld它(ret
)。它也应该是-e myentry
。
现在已经够了。请参阅手册,如果(哈!)您还有其他问题,请回来。