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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 03:36:00