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

HLA汇编实现3数升序排序逻辑错误排查求助

HLA三数升序排序代码问题排查

你代码里存在两个核心逻辑错误:

  1. 比较操作对象错误
    你现有代码中cmp (EAX, EBX)、cmp (EAX, ECX)、cmp (EBX, ECX)比较的是寄存器存储的变量内存地址大小,而非对应变量的数值,和C++参考代码的判断逻辑完全不符。你需要取地址指向的存储值做比较,修改后比较逻辑如下:
cmp ([EAX], [EBX]);     // 比较x、y的数值
jg swapXandY;

cmp ([EAX], [ECX]);     // 比较x、z的数值
jg swapXandZ;

cmp ([EBX], [ECX]);     // 比较y、z的数值
jg swapYandZ;
  1. 分支跳转逻辑缺失
    参考的C++代码是三个独立的if分支,每个分支执行完交换后会进入下一个分支判断,而你的汇编代码没有对应跳转逻辑:只要触发任意一个交换跳转,执行完当前交换代码后会直接顺序执行后续所有交换代码,不管条件是否满足,这就是你测试时三个swap日志都被打印、结果完全错误的原因。
    修复方案是给每个判断节点加跳转标记,每个交换逻辑执行完后跳转到下一个判断节点,修改后的分支逻辑参考如下:
// 第一个判断:x与y比较
cmp ([EAX], [EBX]);
jg swapXandY;

check_xz:   // 第二个判断入口:x与z比较
cmp ([EAX], [ECX]);
jg swapXandZ;

check_yz:   // 第三个判断入口:y与z比较
cmp ([EBX], [ECX]);
jg swapYandZ;
jmp ExitSequence;

swapXandY:
    stdout.put ("swapXandY ");
    // 交换逻辑不变,执行完跳转到下一个判断
    mov ([EAX], DX);                                   
    mov (DX, iTemp);
    mov ([EBX], DX);
    mov (DX, [EAX]);
    mov (iTemp, DX);
    mov (DX, [EBX]);
    jmp check_xz;

swapXandZ:
    stdout.put ("swapXandZ ");
    // 交换逻辑不变,执行完跳转到下一个判断
    mov ([EAX], DX);
    mov (DX, iTemp);
    mov ([ECX], DX);
    mov (DX, [EAX]);
    mov (iTemp, DX);
    mov (DX, [ECX]);
    jmp check_yz;

swapYandZ:
    stdout.put ("swapYandZ ");
    // 交换逻辑不变,执行完跳转到退出流程
    mov ([EBX], DX);
    mov (DX, iTemp);
    mov ([ECX], DX);
    mov (DX, [EBX]);
    mov (iTemp, DX);
    mov (DX, [ECX]);
    jmp ExitSequence;

内容的提问来源于stack exchange,提问作者Matt_Ag

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 21:54:01