【发布时间】:2010-07-13 16:40:59
【问题描述】:
section/segment 指令有多重要?我注意到它们通常是可选的。另外,我注意到当您包含或不包含它们时,输出大小会发生变化。
如果有帮助,我正在使用NASM。
【问题讨论】:
section/segment 指令有多重要?我注意到它们通常是可选的。另外,我注意到当您包含或不包含它们时,输出大小会发生变化。
如果有帮助,我正在使用NASM。
【问题讨论】:
它们非常重要,因为如果将字符串保存在代码段中,程序的执行速度可能会慢得多,并且字符串会破坏指令缓存中的数据。
如果您创建一个库(.lib 或类似的东西),这也很重要,因为由于上述原因,您不希望数据(字符串)直接放在可执行指令后面。
【讨论】:
section .data 和section .bss,它们可以做没有节指令就不能做的事情:读/写静态存储,或者不占用二进制文件空间的零初始化静态存储。 .text 和 .rodata 在 Linux 上都可以链接到同一个 ELF 段,没有问题。您希望将只读数据与代码分开分组,但您无需确保它们不在同一页面内以避免自修改代码管道核弹。
对于任何使用 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 也由它自己的段寻址。它首先重新定位自己,并在初始化结束时从进程的内存中丢弃。
【讨论】: