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

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叠加,彻底打乱了代码块的边界校验逻辑。
修正后的可编译参考代码
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 21:45:08