如何在NASM中实现类似FASM的多独立段布局,将代码数据分入不同段?
问题核心原因
你遇到的段合并问题并非NASM不支持独立段特性,而是两个配置遗漏导致:
- NASM的
section默认未指定独立段类与段落对齐属性,链接器会将类名相同的段自动合并 - OpenWatcom wlink默认开启自动段分组(autogroup),会将64KB以内的代码、数据段合并到同一个物理段以优化内存占用
解决方案
第一步:修改NASM代码,给每个段指定独立类名与对齐规则
bits 16 ; 每个段指定独立class、16字节段落对齐,避免被链接器识别为同类段合并 section code class=CODE align=16 ..start: mov ax, seg hello mov ds, ax mov dx, hello call extra:write_text mov ax, 4c00h int 21h section data class=DATA align=16 hello db "Hello World!", 24h section extra class=EXTRA align=16 write_text: mov ah, 9 int 21h retf section stack class=STACK align=16 resb 100h
编译命令使用:nasm -f obj seg2.asm -o seg2.obj
第二步:修改wlink链接脚本,关闭自动段合并
添加noautogroup参数禁止链接器自动合并段:
system dos option map noautogroup name seg2.exe file seg2.obj
修改后重新链接生成的EXE,载入DEBUG即可看到各段分立、远调用段地址独立的效果,和FASM生成的程序逻辑一致。
补充说明
MASM也可以通过相同的逻辑实现:给每个段指定不同的类名,链接时关闭自动段合并开关即可,并不是只有FASM支持该特性。
内容的提问来源于stack exchange,提问作者cprieto
相关产品推荐
相关产品推荐

