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

编写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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 20:17:06