HLA汇编实现3数升序排序逻辑错误排查求助
HLA三数升序排序代码问题排查
你代码里存在两个核心逻辑错误:
- 比较操作对象错误
你现有代码中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;
- 分支跳转逻辑缺失
参考的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
相关产品推荐
相关产品推荐

