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 ?
修改说明
- 把原本在
stack段后的end3c hlt移到code段的div44子程序之后,让end3c明确属于代码段,消除跨段标签导致的解析混乱。 - 将
mov dx, mesg改为mov dx, data:mesg,显式指定mesg的段归属,让NASM直接确定其地址,避免反复解析调整。
内容的提问来源于stack exchange,提问作者Othan27
相关产品推荐
相关产品推荐

