Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.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 节/段指令有多重要?_Assembly_Nasm - Fatal编程技术网

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