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

NASM编译8086汇编代码时label变更错误的解决咨询

解决NASM编译8086汇编代码时mesg标签的编译错误

编译时出现如下错误:

Line #32: error: label 'mesg' changed during code generation [-w+error=label-redef-late]

对应代码中mesg db 'Division by zero', 0Dh, 0Ah, '$'这一行。

错误原因

这个错误是因为NASM汇编时对mesg标签的位置解析出现歧义:你的代码里end3c标签定义在stack段之后,不属于任何显式声明的代码段,导致NASM在符号解析阶段多次调整mesg的地址映射,触发了“标签在代码生成期间被修改”的错误检查;同时跨段引用标签时未明确段归属,进一步加重了解析歧义。

解决方案

  • 调整end3c标签位置:将end3c hlt移动到code段内,放在div44子程序之后,确保所有代码逻辑归属正确的段。
  • 明确标签的段归属(可选但推荐):引用mesg时加上段前缀data:,让NASM直接定位到data段的mesg,消除解析歧义。

修改后的代码

cpu 8086

segment vectors
resb 1024

segment code
..start mov bx, data
       mov ds, bx
       mov bx, stack
       mov ss, bx
       mov sp, bottom

       mov dx, data:mesg  ; 明确指定mesg所属的data段
       mov ah, 9
       int 21h
       
       xor ax, ax
       mov cs:[0], ax  ; 设置除零异常向量指向div44
       mov cs:[2], cs
       
       jmp end3c

div44: xor dx, dx
       mov cx, cs
       mov [cs:div44], dx
       mov [cs:div44+2], cx
       iret

end3c hlt  ; 将end3c标签移到code段内

segment data
byte0 db ?
word0 dw ?
mesg db 'Division by zero', 0Dh, 0Ah, '$'

segment stack
resb 16
bottom db ?

修改说明

  1. 把原本在stack段后的end3c hlt移到code段的div44子程序之后,让end3c明确属于代码段,消除跨段标签导致的解析混乱。
  2. 将mov dx, mesg改为mov dx, data:mesg,显式指定mesg的段归属,让NASM直接确定其地址,避免反复解析调整。

内容的提问来源于stack exchange,提问作者Othan27

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 22:12:40