Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly NASM中部件中的截面和标签有什么区别?_Assembly_Label_Nasm_Sections - Fatal编程技术网

Assembly NASM中部件中的截面和标签有什么区别?

Assembly NASM中部件中的截面和标签有什么区别?,assembly,label,nasm,sections,Assembly,Label,Nasm,Sections,我目前正在通过NASM assembler学习汇编,我得到了 卡在部分和标签之间的差异中。我 理解节.dat、节.bss或节.text用作 变量声明或初始化的标准,并作为链接器挂钩 例如C中的main()。但是,标签也用于分配 代码中的节。那么,这背后的模糊真相是什么呢?嗯,你知道,有一本很好的手册。如果你没有 使用哪种输出格式很重要-使用-f开关。总的来说节和段是别名,它们的作用相同。它们不区分大小写,如果需要,可以使用段。大多数输出格式(不是-f obj)都有“已知名称”-.text,.da

我目前正在通过NASM assembler学习汇编,我得到了 卡在部分标签之间的差异中。我 理解
节.dat
节.bss
节.text
用作 变量声明或初始化的标准,并作为链接器挂钩 例如C中的
main()
。但是,标签也用于分配
代码中的节。那么,这背后的模糊真相是什么呢?

嗯,你知道,有一本很好的手册。如果你没有

使用哪种输出格式很重要-使用
-f
开关。总的来说<代码>节和
是别名,它们的作用相同。它们不区分大小写,如果需要,可以使用
段。大多数输出格式(不是
-f obj
)都有“已知名称”-
.text
.data
.bss
(还有一些其他格式)。这些是区分大小写的-
部分。文本可能不符合您的要求。通常,
section.text
是可执行的,但是只读的。尝试写入将导致分段错误(或Windows称之为-GPF的任何内容)<代码>部分。数据
用于初始化数据-
msg db“Hello World!”、0
frooble\u count dd 42
section.bss
用于未初始化的数据,它只在内存中保留空间,不包括在磁盘文件中。您只能在那里使用“reserve”伪指令-
resb
resw
resd
,等等。它后面的参数指示要保留的字节数(等)。在
-f bin
输出格式中,没有节/段(这就是为什么它是“平面二进制”)-Nasm只需先生成
。text
,然后移动
。data
,最后再移动
。bss
即可按任意顺序编写

标签不定义节!Nasm只是将它们转换成数字——它们出现在代码中的地址——这就是可执行文件中出现的地址。您可以使用标签作为变量名,或者作为代码中的一个点,您可能希望调用
jmp
。Nasm也是如此。一些汇编器“记住”您所说的变量的大小,如果您试图错误地使用它,就会抛出错误。Nasm有健忘症-你可以毫无怨言地做
mov[mybyte],eax
。有时这是有用的,但更多的时候这是一个错误。一个“太大”的变量通常不是问题——一个“太小”的变量可能会导致一个错误,这个错误通常会在以后才会出现。很难调试!标签不能以十进制数字开头(数字必须以十进制数字开头)。以句号(点)开头的标签是本地标签。其范围是从最后一个非本地标签到下一个非本地标签。更多细节请参见友好手册-这只是一个介绍

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


这就够了。查看手册,如果(哈!)你还有其他问题,请回来。

嗯,你知道,有一本很好的手册。如果你没有

使用哪种输出格式很重要-使用
-f
开关。总的来说<代码>节
是别名,它们的作用相同。它们不区分大小写,如果需要,可以使用
段。大多数输出格式(不是
-f obj
)都有“已知名称”-
.text
.data
.bss
(还有一些其他格式)。这些是区分大小写的-
部分。文本可能不符合您的要求。通常,
section.text
是可执行的,但是只读的。尝试写入将导致分段错误(或Windows称之为-GPF的任何内容)<代码>部分。数据
用于初始化数据-
msg db“Hello World!”、0
frooble\u count dd 42
section.bss
用于未初始化的数据,它只在内存中保留空间,不包括在磁盘文件中。您只能在那里使用“reserve”伪指令-
resb
resw
resd
,等等。它后面的参数指示要保留的字节数(等)。在
-f bin
输出格式中,没有节/段(这就是为什么它是“平面二进制”)-Nasm只需先生成
。text
,然后移动
。data
,最后再移动
。bss
即可按任意顺序编写

标签不定义节!Nasm只是将它们转换成数字——它们出现在代码中的地址——这就是可执行文件中出现的地址。您可以使用标签作为变量名,或者作为代码中的一个点,您可能希望调用
jmp
。Nasm也是如此。一些汇编器“记住”您所说的变量的大小,如果您试图错误地使用它,就会抛出错误。Nasm有健忘症-你可以毫无怨言地做
mov[mybyte],eax
。有时这是有用的,但更多的时候这是一个错误。一个“太大”的变量通常不是问题——一个“太小”的变量可能会导致一个错误,这个错误通常会在以后才会出现。很难调试!阿玛