部分/细分指令有多重要?

时间:2010-07-13 16:40:59

标签: assembly nasm

部分/细分指令有多重要?我注意到它们通常是可选的。另外,我注意到当你输入或不包含它们时输出大小会改变。

我正在使用NASM,如果有帮助的话。

2 个答案:

答案 0 :(得分:1)

它们非常重要,因为如果将字符串保存在代码段中,程序执行速度会慢得多,并且字符串会炸毁指令缓存中的数据。

如果您创建了一个库(.lib或类似的东西),它也很重要,因为由于上述原因,您不会将数据(字符串)直接放在可执行指令后面。

答案 1 :(得分:1)

对于使用NASM的多节bin输出格式:https://www.nasm.us/xdoc/2.14.02/html/nasmdoc7.html#section-7.1.3

的任何非平凡的内存布局,各节都是至关重要的

例如,以下是我在其中一个程序中设置的部分:https://hg.ulukai.org/ecm/ldebug/file/126b4d793c94/source/debug.asm#l109

        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

DATA_ENTRY和两个ASMTABLE节均由同一段寻址,并且不会从将它们装入进程的位置进行重定位。 DATASTACK也由先前的段解决,但它是nobits部分。 CODE由其自己的段寻址,因此vstart = 0。在初始化期间,它也被重新放置到DATASTACK后面的某个位置(确切位置取决于某些情况)。 INIT也由其自己的细分市场解决。它会首先重新定位自己,并在初始化结束时从进程的内存中丢弃。