You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 05:48:00