section .data
array dd 64, 25, 12, 22, 11 ; 待排序的数组
array_size equ ($ - array) / 4 ; 数组的大小(以双字节为单位)
section .text
global _start
_start:
; 冒泡排序算法
mov ecx, array_size ; ecx 存储数组长度
dec ecx ; 减1以便与索引匹配
outer_loop:
mov ebx, 0 ; ebx 用于内部循环计数,每次迭代后重置为0
mov edx, ecx ; edx 用于内部循环中的比较计数,初始值为数组长度
inner_loop:
mov eax, [array + ebx * 4] ; 加载当前元素到 eax
cmp eax, [array + ebx * 4 + 4] ; 比较当前元素和下一个元素
jg swap_if_greater ; 如果当前元素大于下一个元素,则交换它们
continue_inner_loop:
inc ebx ; 增加内部循环计数器
dec edx ; 减少比较计数器
cmp edx, 0 ; 检查是否到达数组末尾
jne inner_loop ; 如果没有,继续内部循环
dec ecx ; 减少外部循环计数器
cmp ecx, 0 ; 检查是否完成排序
jne outer_loop ; 如果没有,继续外部循环
; 输出排序后的数组
mov ecx, array_size
mov ebx, 0
print_loop:
mov eax, [array + ebx * 4]
call print_integer
inc ebx
loop print_loop
; 退出程序
mov eax, 1
xor ebx, ebx
int 0x80
swap_if_greater:
mov edx, [array + ebx * 4] ; 交换当前元素和下一个元素
xchg edx, [array + ebx * 4 + 4]
mov [array + ebx * 4], edx
jmp continue_inner_loop
print_integer:
; 输出整数
push eax
call print_nl
pop eax
mov eax, 4
mov ebx, 1
mov ecx, eax
int 0x80
ret
print_nl:
; 输出新行
mov eax, 4
mov ebx, 1
mov ecx, nl
mov edx, nl_len
int 0x80
ret
section .bss
nl resb 1
nl_len equ $ - nl