x86汇编实现RLE编码统计数组元素时CMP跳转异常求助
x86汇编RLE编码异常问题解决方案
核心故障原因
你触发错误跳转的根因是跳转指令类型和操作数的符号属性不匹配:
JG是有符号数的「大于则跳转」指令,判断逻辑依赖符号标志SF和溢出标志OF- 你把BL当作无符号8位整数使用,255对应的8位补码是
0xFF,在有符号数体系下值为-1 - 当BL值为2时,有符号比较逻辑会判定
2 > -1成立,因此直接触发跳转到AdjustValue分支
修复方案
把RegisterOccurrence段里的JG AdjustValue替换为无符号数大于跳转指令JA AdjustValue即可,JA基于进位标志CF和零标志ZF判断,完全符合无符号数的比较逻辑。
其他潜在Bug修复建议
- 移除Loop段中的死代码:你在
CMP DL,CL后已经写了JE Occurrence和JNE SingleNumber,所有分支都会跳转走,后面的INC ESI永远不会执行,可以直接删除。 - 补充边界越界检查:你读取
[Buffer+ESI+1]的时候没有判断ESI+1是否超过数组长度Len,可能触发非法内存访问。 - 校验单次计数逻辑:当前
SingleNumber分支默认计数为1,但如果之前已经在Occurrence分支累计过BL的值,会直接丢失已统计的次数,建议梳理连续相同元素的计数全流程逻辑。
问题代码标注
__asm { XOR EAX, EAX XOR EBX, EBX XOR ECX, ECX XOR EDX, EDX XOR EDI, EDI XOR ESI, ESI MOV EAX, Len Loop: CMP ESI,EAX JE EndProgram MOV DL,[Buffer+ESI] MOV CL,[Buffer+ESI+1] CMP DL,CL JE Occurrence JNE SingleNumber INC ESI ; 死代码,永远不会执行 JMP Loop SingleNumber: MOV BufComp[EDI],1 MOV BufComp[EDI+1],DL INC ESI ADD EDI,2 JMP Loop Occurrence: INC BL INC ESI MOV DL, [Buffer + ESI] MOV CL, [Buffer + ESI + 1] CMP DL,CL JNE RegisterOccurrence JMP Loop RegisterOccurrence: INC BL CMP BL,255 JG AdjustValue ; 问题点:有符号跳转指令不匹配无符号数比较场景 MOV BufComp[EDI],BL MOV BufComp[EDI+1],DL INC ESI ADD EDI,2 XOR EBX,EBX JMP Loop AdjustValue: SUB BL,255 MOV BufComp[EDI],255 MOV BufComp[EDI+1],DL ADD EDI,2 MOV BufComp[EDI],BL MOV BufComp[EDI+1],DL INC ESI ADD EDI,2 XOR EBX,EBX JMP Loop EndProgram: MOV BufComp[EDI],0d }
内容的提问来源于stack exchange,提问作者Everything Pro
相关产品推荐
相关产品推荐

