x86汇编报main段unmatched block nesting错误 无匹配end指令求助
报错根因定位
unmatched block nesting : main [ASM]报错本质不是缺少end指令,而是源程序的伪指令顺序、代码块边界完全错乱,导致汇编器的嵌套校验逻辑失效,具体问题点:
- 直接触发报错的核心原因是代码块中间插入了孤立的
end伪指令:你在int 3h语句后、main过程未结束的位置直接写了无入口参数的end,汇编器执行到该行时,会将其判定为整个源程序的终止标记。后续写在这行之后的所有内容——包括INVOKE ExitProcess, 0、main ENDP、END main——都会被标记为程序块范围外的无效内容。此时汇编器检测到main PROC开启的过程块没有匹配的ENDP闭合标记,就会抛出块嵌套不匹配的提示。 - 存在冗余的重复栈段定义:连续声明了3条
.stack伪指令,分别指定4096、32、100h的栈大小,在平面内存模型下会造成段解析异常。 - 代码与Irvine32.inc的适配存在多处错误:
- 混用了16位实模式的中断调用(
int 21h、int 3h),这类中断在Irvine32对应的32位保护模式运行环境下不被支持 - 多处寄存器拼写错误:
eds应为edx,不存在eah/eal/ecl这类带e前缀的8位寄存器名(x86 32位架构下8位通用寄存器无e前缀命名) - 伪指令顺序颠倒:用来标记main过程结束的
main ENDP被放在了最终程序终止标记END main的前面,和提前插入的孤立end叠加,彻底打乱了代码块的边界校验逻辑。
- 混用了16位实模式的中断调用(
修正后的可编译参考代码
INCLUDE Irvine32.inc .386 .model flat, stdcall .stack 4096 ExitProcess PROTO, deExitCode:DWORD .data fib DWORD 100 DUP(?) .code main PROC mov eax, 0 mov ebx, 1 mov esi, OFFSET fib mov ecx, 10 ; 定义要生成的斐波那契数长度 test ecx, ecx jz exit_prog L_fib: mov [esi], eax add esi, 4 mov edx, eax add eax, ebx mov ebx, edx dec ecx jnz L_fib exit_prog: INVOKE ExitProcess, 0 main ENDP END main
内容的提问来源于stack exchange,提问作者hellokev
相关产品推荐
相关产品推荐

