MASM汇编代码中查找字符串子串的更优实现方法?
汇编子串匹配代码无栈操作优化方案
你原代码中PUSH/POP操作的作用是备份CX、SI、DI三个寄存器的值,避免被REPE CMPSB指令修改。要去掉栈操作可以直接替换隐式修改寄存器的串比较指令,改用手动内层循环完成匹配校验,全程用寄存器暂存中间值即可,不需要栈参与。
优化后的完整代码
comparing proc MOV CX, SIZEOF vec2 ; 子串总长度 DEC CX MOV DX, SIZEOF vec1 ; 主串总长度 LEA SI, vec1 ; 主串当前指针 LEA DI, vec2 ; 子串起始指针 FIND_FIRST: ; 主串剩余长度不足匹配子串,直接返回未找到 CMP DX, CX JB N_FINDED ; 匹配子串首字符 MOV AL, [SI] MOV AH, [DI] CMP AL, AH JNE NEXT ; 内层循环校验完整子串,无栈操作 MOV BX, 1 FITTING_LOOP: CMP BX, CX JA FINDED MOV AL, [SI + BX] MOV AH, [DI + BX] CMP AL, AH JNE NEXT INC BX JMP FITTING_LOOP NEXT: INC SI DEC DX JMP FIND_FIRST FINDED: MOV AL, 01H JMP RETURN N_FINDED: MOV AL, 00H RETURN: ret comparing endp
改动说明
- 完全移除了所有栈操作:内层匹配使用基址+偏移的方式访问主串和子串,不会修改外层循环依赖的
SI、DI、CX寄存器值,不需要额外备份 - 新增剩余长度校验逻辑:进入子串全匹配前先判断主串剩余长度是否足够,避免无效比较和内存越界问题
- 精简了跳转分支:去掉了原代码中冗余的对等跳转,执行效率更高
内容的提问来源于stack exchange,提问作者Brando Muñoz
相关产品推荐
相关产品推荐

