编写NASM x86冒泡排序时遇数组越界问题求助
冒泡排序数组越界问题排查与NASM x86实现
数组越界常见原因及修复思路
- 循环边界设置错误:冒泡排序外层循环只需执行
n-1次(n为数组长度),内层循环每轮应减少i次(i为当前外层循环次数),避免重复访问已排好序的末尾元素。如果内层循环仍以n-1为边界,就可能访问到数组外的内存。 - 索引计算失误:数组索引从0开始,最后一个有效元素的索引是
n-1。如果代码中使用n作为索引上限,必然触发越界。 - 交换逻辑的索引错误:交换元素时若错误使用超出范围的索引(比如
j+1超过n-1),也会导致越界。
NASM x86 32位简易冒泡排序实现(Linux环境)
以下是针对32位整数数组的冒泡排序实现,包含完整注释,从逻辑上避免越界问题:
section .data arr dd 5, 2, 9, 1, 5, 6 ; 待排序的32位整数数组 arr_len equ ($ - arr)/4 ; 自动计算数组元素个数(每个元素占4字节) section .text global _start _start: mov ecx, arr_len ; ecx存储数组长度,作为外层循环计数器 outer_loop: cmp ecx, 1 ; 外层循环只需执行n-1次,计数器<=1时结束 jle exit_sort mov edx, 0 ; edx作为内层循环计数器j inner_loop: ; 取当前元素和下一个元素的地址 mov eax, arr + edx*4 mov ebx, arr + (edx+1)*4 ; 加载元素值到寄存器 mov esi, [eax] mov edi, [ebx] ; 比较大小,无需交换则跳过 cmp esi, edi jle skip_swap ; 交换两个元素 mov [eax], edi mov [ebx], esi skip_swap: inc edx cmp edx, ecx-1 ; 内层循环到ecx-1终止,确保j+1不会越界 jl inner_loop dec ecx ; 外层循环计数器减1,减少下一轮内层循环次数 jmp outer_loop exit_sort: ; 排序完成,此处可添加输出逻辑或直接退出 mov eax, 1 ; sys_exit系统调用号 xor ebx, ebx int 0x80
关键细节说明
arr_len通过($ - arr)/4动态计算,避免硬编码长度导致的匹配错误。- 内层循环终止条件
edx < ecx-1,严格保证edx+1不会超出数组最后一个元素的索引范围。 - 每轮外层循环后
ecx减1,因为末尾的ecx个元素已完成排序,无需重复比较。
内容的提问来源于stack exchange,提问作者Karlen Hayrapetyan
相关产品推荐
相关产品推荐

