【问题标题】:How important are section/segment directives?部分/段指令有多重要?
【发布时间】:2010-07-13 16:40:59
【问题描述】:

section/segment 指令有多重要?我注意到它们通常是可选的。另外,我注意到当您包含或不包含它们时,输出大小会发生变化。

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

【问题讨论】:

    标签: assembly nasm


    【解决方案1】:

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

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

    【讨论】:

    • 嗯……我猜这很有道理。无论如何,出于可读性的原因,我决定使用它们。谢谢,我会将此标记为已接受的答案,直至另行通知。
    • @someguy:将只读字符串数据放在代码附近的性能下降很小。一个更好的例子是section .data 和section .bss,它们可以做没有节指令就不能做的事情:读/写静态存储,或者不占用二进制文件空间的零初始化静态存储。 .text 和 .rodata 在 Linux 上都可以链接到同一个 ELF 段,没有问题。您希望将只读数据与代码分开分组,但您无需确保它们不在同一页面内以避免自修改代码管道核弹。
    【解决方案2】:

    对于任何使用 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 也由它自己的段寻址。它首先重新定位自己,并在初始化结束时从进程的内存中丢弃。

    【讨论】:

      猜你喜欢
      • 2022-01-04
      • 2021-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多