3

How important are section/segment directives? I've noticed that they are usually optional. Also, I've noticed that the output size changes when you do or do not include them.

I'm using NASM, if that helps.

4

2 回答 2

1

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

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

于 2010-07-14T13:09:54.400 回答
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 也由它自己的段寻址。它首先重新定位自己,并在初始化结束时从进程的内存中丢弃。

于 2019-08-28T20:25:17.813 回答