1. section .data
    2. array dd 64, 25, 12, 22, 11 ; 待排序的数组
    3. array_size equ ($ - array) / 4 ; 数组的大小(以双字节为单位)
    4. section .text
    5. global _start
    6. _start:
    7. ; 冒泡排序算法
    8. mov ecx, array_size ; ecx 存储数组长度
    9. dec ecx ; 1以便与索引匹配
    10. outer_loop:
    11. mov ebx, 0 ; ebx 用于内部循环计数,每次迭代后重置为0
    12. mov edx, ecx ; edx 用于内部循环中的比较计数,初始值为数组长度
    13. inner_loop:
    14. mov eax, [array + ebx * 4] ; 加载当前元素到 eax
    15. cmp eax, [array + ebx * 4 + 4] ; 比较当前元素和下一个元素
    16. jg swap_if_greater ; 如果当前元素大于下一个元素,则交换它们
    17. continue_inner_loop:
    18. inc ebx ; 增加内部循环计数器
    19. dec edx ; 减少比较计数器
    20. cmp edx, 0 ; 检查是否到达数组末尾
    21. jne inner_loop ; 如果没有,继续内部循环
    22. dec ecx ; 减少外部循环计数器
    23. cmp ecx, 0 ; 检查是否完成排序
    24. jne outer_loop ; 如果没有,继续外部循环
    25. ; 输出排序后的数组
    26. mov ecx, array_size
    27. mov ebx, 0
    28. print_loop:
    29. mov eax, [array + ebx * 4]
    30. call print_integer
    31. inc ebx
    32. loop print_loop
    33. ; 退出程序
    34. mov eax, 1
    35. xor ebx, ebx
    36. int 0x80
    37. swap_if_greater:
    38. mov edx, [array + ebx * 4] ; 交换当前元素和下一个元素
    39. xchg edx, [array + ebx * 4 + 4]
    40. mov [array + ebx * 4], edx
    41. jmp continue_inner_loop
    42. print_integer:
    43. ; 输出整数
    44. push eax
    45. call print_nl
    46. pop eax
    47. mov eax, 4
    48. mov ebx, 1
    49. mov ecx, eax
    50. int 0x80
    51. ret
    52. print_nl:
    53. ; 输出新行
    54. mov eax, 4
    55. mov ebx, 1
    56. mov ecx, nl
    57. mov edx, nl_len
    58. int 0x80
    59. ret
    60. section .bss
    61. nl resb 1
    62. nl_len equ $ - nl