基于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
相关产品推荐
相关产品推荐

