x86汇编使用.IF/.ELSE/.ELSEIF对比两个DWORD数值的异常排查
x86汇编条件判断逻辑错误修复
问题根因
- 库函数
readInt的返回值固定存储在eax寄存器中,你读取第二个输入后没有将返回的eax赋值给ecx和num2,反而直接读取了未初始化的ecx,导致num2和ecx存储的是随机垃圾数据。 - 读取第二个输入时,
eax会被新的输入值覆盖,原本存储第一个输入值的eax已经丢失,后续比较的两个寄存器值完全不符合预期。 - 分支判断拆分了两个独立的
.IF块,就算数值相等也会继续执行后续的大小判断代码,逻辑不严谨;且判断条件冗余,ecx > eax与eax < ecx完全等价,不需要用&&重复判断。
修正后代码
include asmlib.inc .data Prompt BYTE " Enter Number 1 ", 0 Prompt2 BYTE " Enter Number 2 ", 0 Large BYTE " Is larger ", 0 Equal BYTE " Is equal", 0 num1 DWORD ? num2 DWORD ? .code main PROC ; 读取第一个数,存入num1和ecx暂存 mov edx, OFFSET Prompt call writeLine call readInt mov num1, eax mov ecx, eax ; 暂存第一个数到ecx,避免后续被readInt覆盖 endl ; 读取第二个数,存入num2和eax mov edx, OFFSET Prompt2 call writeLine call readInt mov num2, eax endl ; 统一分支判断 .IF eax == ecx mov edx, OFFSET Equal call writeString .ELSEIF eax > ecx ; 第二个数(eax存储)更大 call writeInt mov edx, OFFSET Large call writeString .ELSE ; 第一个数(ecx存储)更大 mov eax, ecx call writeInt mov edx, OFFSET Large call writeString .ENDIF exit main ENDP end main
内容的提问来源于stack exchange,提问作者user16889509
相关产品推荐
相关产品推荐

