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

基于Irvine32库实现unsigned DWORD数组降序排序的汇编代码问题求助

汇编数组降序排序问题修复方案

核心问题排查

你代码中存在以下4处关键错误导致排序功能异常:

  • 排序逻辑缺失外层循环:当前sort_arr仅实现了1轮相邻元素比较,冒泡排序需要执行数组长度-1轮遍历才能将最大元素逐步移动到数组首位
  • compare_and_swap调用swap时传参错误:你传入了两个元素的值而非内存地址,导致swap无法修改原数组的内容
  • sort_arr中遍历指针未递增:你注释掉了add esi, type arr1语句,导致每次循环都重复比较数组前两个元素
  • swap实现逻辑不规范:当前swap依赖外部函数的esi/edi寄存器存储地址,不符合栈传参的设计要求

修正后的核心代码片段

1. sort_arr 函数(冒泡排序实现)

sort_arr proc
   push ebp
   mov ebp, esp
   mov ecx, [ebp + 8]       ; 取数组长度
   dec ecx                  ; 外层循环需要n-1轮
outer_loop:
   push ecx                 ; 保存外层循环计数
   mov esi, [ebp + 12]      ; 每次外层循环重置指针到数组首地址
inner_loop:
   mov edi, esi
   add edi, type arr1
   push esi
   push edi
   call compare_and_swap
   add esi, type arr1       ; 指针后移比较下一组元素
   loop inner_loop
   pop ecx                  ; 恢复外层循环计数
   loop outer_loop

   pop ebp
   ret 8
sort_arr endp

2. compare_and_swap 函数

compare_and_swap proc
   push ebp
   mov ebp, esp
   mov esi, [ebp + 12]      ; 取x的地址
   mov edi, [ebp + 8]       ; 取y的地址
   mov edx, [edi]           ; 取y的值
   mov ebx, [esi]           ; 取x的值
   cmp edx, ebx
   jae skipSwap             ; y >= x不需要交换
   push esi                 ; 传入x的地址
   push edi                 ; 传入y的地址
   call swap
skipSwap:
   pop ebp
   ret 8
compare_and_swap endp

3. swap 函数

swap proc
   push ebp
   mov ebp, esp
   push eax
   mov esi, [ebp + 12]      ; 取x的地址
   mov edi, [ebp + 8]       ; 取y的地址
   mov eax, [esi]           ; 暂存x的值
   mov ebx, [edi]           ; 暂存y的值
   mov [esi], ebx           ; 写入y的值到x地址
   mov [edi], eax           ; 写入x的值到y地址
   pop eax
   pop ebp
   ret 8
swap endp

额外优化点

  • 可以在print_arr中判断数组长度是否为0,避免空数组打印异常
  • 输入结束的0不会被计入数组元素,符合需求要求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 19:36:02