使用JWasm -bin参数时如何将_BSS段按4字节对齐?
JWasm -bin模式下_BSS段4字节对齐的正确方法
先分析你遇到的三个问题原因:
- .model tiny的警告问题:tiny模型强制所有段合并为一个16字节对齐(PARA)的段,你在.data?段里加
ALIGN 4和段的默认对齐方式冲突,因此触发A4130警告。tiny模型不支持多段分治,不适合你的需求。 - 段寄存器访问错误:你定义的_BSS段缺少
SEGMENT关键字和属性声明,且代码中未将DS寄存器切换到_BSS段。默认情况下CS指向_TEXT段,直接访问[var1]会用CS寻址,而var1属于_BSS段,段寄存器不匹配导致A2089错误。 - 二进制体积超标:把BSS的未初始化数据放到_TEXT段后,这些数据会被当作代码段的一部分写入二进制文件,4096字节的buf直接导致文件体积暴涨——而BSS段的本质是内存中分配、不占用文件空间的未初始化数据区,不该放到代码段。
正确的实现代码
_TEXT SEGMENT PARA PUBLIC 'CODE' _start: ; 初始化DS寄存器指向_BSS段,确保变量访问正确 mov ax, _BSS mov ds, ax ; 访问BSS段变量 mov [var1], ax _TEXT ENDS ; 定义_BSS段时指定4字节对齐 _BSS SEGMENT PARA PUBLIC 'BSS' ALIGN=4 var1 dw ? var2 dw ? buf db 4096 dup(?) _BSS ENDS END _start
关键说明:
- 编译时使用命令:
jwasm -bin yourfile.asm,生成的二进制文件仅包含_TEXT段的代码,_BSS段的内容不会被写入文件(符合BSS段的特性)。 ALIGN=4是在定义_BSS段时指定的段对齐属性,确保段的起始地址按4字节对齐。- 必须手动初始化DS寄存器指向_BSS段,否则无法正确访问该段内的变量——因为-bin模式生成的是纯二进制,没有自动的段寄存器初始化逻辑。
- 如果需要在程序加载时为BSS段分配内存,可以通过计算
_BSS到$的偏移量得到BSS段的总大小(即$ - _BSS),在加载后申请对应大小的内存并清零。
内容的提问来源于stack exchange,提问作者Joshua
相关产品推荐
相关产品推荐

