MASM编译报错Unmatched macro nesting,求查数组最大值函数问题
汇编报错
fatal error A1008: unmatched macro nesting排查与修复 编译错误原因
while是MASM汇编器的保留关键字(属于内置循环宏的一部分),你将它用作循环标签名,导致编译器误识别为宏操作,触发宏嵌套不匹配的错误。只需把标签while改为非关键字名称(比如loop_start),即可解决这个编译问题。
代码其他潜在问题修复
除了编译错误,你的代码还有几个逻辑和类型问题需要修正:
- 指针步长错误:你定义
b byte 4是单字节变量,add rcx, b会因类型扩展问题导致指针只移动1字节(而非int类型需要的4字节),直接替换为add rcx, 4更准确可靠。 - 循环逻辑冗余:初始代码会先重复比较第一个元素和自身,且循环次数计算有误。调整后的循环逻辑更高效:
.data .code search_max proc mov rax, [rcx] ; 取数组第一个元素作为初始最大值 dec rdx ; 已处理第一个元素,剩余循环次数为size-1 jz end_while ; 如果数组长度为1,直接返回 loop_start: add rcx, 4 ; 移动指针到下一个int元素 cmp [rcx], rax ; 比较当前元素与当前最大值 jna without_assign; 当前元素更小,跳过赋值 mov rax, [rcx] ; 更新最大值 without_assign: dec rdx jnz loop_start ; 未循环完则继续 end_while: ret search_max endp end - 调用约定合规性:x64下
extern "C"的调用约定中,rcx存数组指针、rdx存长度,返回值存在rax,这部分你的代码是符合要求的。
内容的提问来源于stack exchange,提问作者ceasar13m
相关产品推荐
相关产品推荐

