Assembly 节/段指令有多重要?
节/段指令有多重要?我注意到它们通常是可选的。另外,我注意到,当您包含或不包含它们时,输出大小会发生变化Assembly 节/段指令有多重要?,assembly,nasm,Assembly,Nasm,节/段指令有多重要?我注意到它们通常是可选的。另外,我注意到,当您包含或不包含它们时,输出大小会发生变化 如果有帮助的话,我正在使用。它们非常重要,因为如果将字符串保存在代码段中,程序的执行速度可能会慢得多,并且字符串会破坏指令缓存中的数据 如果您创建一个库(.lib或类似的东西),这也很重要,因为您不想因为上述原因而将数据(字符串)直接放在可执行指令后面。节对于使用NASM的多节bin输出格式的任何非平凡内存布局都至关重要: 例如,我正在我的一个程序中设置以下部分: 数据输入和两个ASMTAB
如果有帮助的话,我正在使用。它们非常重要,因为如果将字符串保存在代码段中,程序的执行速度可能会慢得多,并且字符串会破坏指令缓存中的数据
如果您创建一个库(.lib或类似的东西),这也很重要,因为您不想因为上述原因而将数据(字符串)直接放在可执行指令后面。节对于使用NASM的多节bin输出格式的任何非平凡内存布局都至关重要: 例如,我正在我的一个程序中设置以下部分:
数据输入和两个ASMTABLE部分都由同一段处理,并且不会从加载到流程中的位置重新定位。DATASTACK也在前面的部分中提到,但它是nobits部分。代码由它自己的段寻址,因此vstart=0。在初始化过程中,它还被重新定位到DATASTACK后面的某个位置(具体位置取决于某些情况)。INIT也由它自己的部分处理。它首先重新定位自身,并在初始化结束时从进程内存中丢弃。Hmm。。。我想这是有道理的。无论如何,出于可读性的原因,我决定使用它们。谢谢,我会将此标记为已接受的答案,直到另行通知。@someguy:将只读字符串数据放在代码附近的性能缺点很小。一个更好的例子是
section.data
和section.bss
,它们可以做没有section指令就无法做的事情:读/写静态存储,或者零初始化静态存储,不占用二进制文件中的任何空间.text
和.rodata
都可以在Linux上链接到同一个ELF段,而不会出现问题。您希望将只读数据与代码分开分组,但不需要确保它们不在同一页中,以避免自我修改代码管道。
cpu 8086
org 100h
addsection lDEBUG_DATA_ENTRY, align=16 start=100h
data_entry_start:
addsection ASMTABLE1, align=16 follows=lDEBUG_DATA_ENTRY
addsection ASMTABLE2, align=16 follows=ASMTABLE1
addsection lDEBUG_CODE, align=16 follows=ASMTABLE2 vstart=0
code_start:
addsection DATASTACK, align=16 follows=ASMTABLE2 nobits
addsection INIT, align=16 follows=lDEBUG_CODE vstart=0