如何用汇编语言写冒泡排序
时间: 2023-11-07 20:08:45 浏览: 146
汇编写冒泡排序
以下是一个用汇编语言写的冒泡排序的示例:
```
; 冒泡排序程序
; 输入:数组a,长度n
; 输出:按升序排列的数组a
section .data
section .bss
a resb 100 ; 数组a,最多100个元素
section .text
global _start
_start:
; 初始化数组a
mov ecx, 0 ; 计数器清零
mov esi, a ; esi指向数组a
mov eax, 10 ; eax为数组长度
init_loop:
cmp ecx, eax ; 比较计数器与数组长度
je sort_loop ; 如果计数器等于数组长度,跳转到排序循环
mov [esi], ecx ; 将计数器的值存入数组a
inc ecx ; 计数器加1
add esi, 4 ; 指向数组下一个元素
jmp init_loop ; 继续初始化数组a
sort_loop:
; 冒泡排序
mov ecx, eax ; ecx为数组长度
outer_loop:
dec ecx ; 外层循环计数器减1
mov esi, a ; esi指向数组a
inner_loop:
cmp ecx, 0 ; 比较内层循环计数器与0
jl print_loop ; 如果内层循环计数器小于0,跳转到输出循环
mov eax, [esi] ; 取出数组a的一个元素
cmp eax, [esi+4] ; 比较数组a相邻两个元素的大小
jle no_swap ; 如果前一个元素小于等于后一个元素,跳过交换
xchg eax, [esi+4] ; 交换相邻两个元素
mov [esi], eax ; 将交换后的元素存回数组a
no_swap:
add esi, 4 ; 指向数组下一个元素
dec ecx ; 内层循环计数器减1
jmp inner_loop ; 继续内层循环
print_loop:
; 输出排好序的数组a
mov ecx, 0 ; 计数器清零
mov esi, a ; esi指向数组a
print_loop2:
cmp ecx, eax ; 比较计数器与数组长度
je exit ; 如果计数器等于数组长度,跳转到退出程序
mov eax, [esi] ; 取出数组a的一个元素
push eax ; 存入栈中
call print_int ; 调用输出整数子程序
add esp, 4 ; 栈指针加4
inc ecx ; 计数器加1
add esi, 4 ; 指向数组下一个元素
jmp print_loop2 ; 继续输出循环
exit:
; 退出程序
mov eax, 1 ; 系统调用号1为退出程序
xor ebx, ebx ; 返回值为0
int 0x80 ; 调用中断0x80,执行系统调用
; 输出整数子程序
; 输入:eax为要输出的整数
; 输出:无
print_int:
push ebx ; 保存ebx的值
push ecx ; 保存ecx的值
push edx ; 保存edx的值
push eax ; 将要输出的整数存入栈中
mov eax, 4 ; 系统调用号4为输出字符串
mov ebx, 1 ; 文件描述符1为标准输出
mov ecx, esp ; 将栈顶指针存入ecx
mov edx, 4 ; 要输出的字节数为4
int 0x80 ; 调用中断0x80,执行系统调用
pop eax ; 弹出栈顶元素
pop edx ; 恢复edx的值
pop ecx ; 恢复ecx的值
pop ebx ; 恢复ebx的值
ret ; 返回
```
阅读全文