8086汇编语言实现冒泡排序
时间: 2023-07-10 08:32:39 浏览: 59
下面是8086汇编语言实现冒泡排序的示例代码:
```
.MODEL SMALL
.STACK 100H
.DATA
ARRAY DB 5, 2, 9, 1, 8, 3, 7, 4, 6, 0
LENGTH DB 10
.CODE
MAIN PROC
MOV AX, @DATA
MOV DS, AX
MOV CX, LENGTH
DEC CX
MOV BX, 0
OUTER_LOOP:
MOV SI, 0
INNER_LOOP:
MOV AL, ARRAY[SI]
CMP AL, ARRAY[SI+1]
JLE NOT_SWAP
XCHG AL, ARRAY[SI+1]
MOV ARRAY[SI], AL
MOV BX, 1
NOT_SWAP:
INC SI
LOOP INNER_LOOP
CMP BX, 0
JZ SORTED
DEC CX
JMP OUTER_LOOP
SORTED:
MOV AH, 4CH
INT 21H
MAIN ENDP
END MAIN
```
这段代码定义了一个包含10个元素的数组,并使用冒泡排序算法对其进行排序。通过循环遍历数组,如果相邻的两个元素需要交换,则进行交换操作。如果在一次循环中没有发生任何交换,则说明数组已经排好序。
相关问题
8086汇编语言冒泡排序
下面是8086汇编语言实现冒泡排序的示例代码:
```
; 冒泡排序
; 将数组a中的数据从小到大排序
; a:存放待排序数据的数组
; n:数组中数据的个数
.model small
.stack 100h
.data
a db 7, 2, 4, 1, 5, 3, 6 ; 待排序数组
n equ $-a ; 数组中数据的个数
.code
main proc
mov ax, @data
mov ds, ax
mov cx, n ; cx寄存器存储循环次数
dec cx ; 最后一个数不用比较,所以循环次数-1
L1: mov si, 0 ; si寄存器指向数组a的第一个元素
L2: mov di, si ; di寄存器指向数组a的第一个元素
inc di ; 比较数组a的相邻两个元素
L3: cmp di, n ; 如果已经比较到了数组最后一个元素,则结束本次循环
je L5
mov al, [a+si] ; 取出数组a中si位置的元素
mov bl, [a+di] ; 取出数组a中di位置的元素
cmp al, bl ; 比较两个元素的大小
jle L4 ; 如果a[si] <= a[di],则跳过交换操作
xchg al, bl ; 交换两个元素的值
mov [a+si], al ; 将交换后的值存回数组a
mov [a+di], bl
L4: inc si ; si和di指针分别向后移动一位
inc di
jmp L3
L5: loop L1 ; 循环次数减一
mov ah, 4ch
int 21h
main endp
end main
```
以上代码将数组a中的数据从小到大排序,可以通过修改比较大小的方式实现从大到小排序。
mips汇编语言实现冒泡排序
冒泡排序是一种简单的排序算法,可以用MIPS汇编语言来实现。下面是一个基于MIPS汇编语言的冒泡排序示例:
```
# $a0 - 存放数组的起始地址
# $a1 - 数组长度
.data
array: .word 5, 2, 3, 8, 6 # 初始化一个数组
newline: .asciiz "\n"
.text
.globl main
main:
la $a0, array # 将数组地址存储在$a0中
lw $a1, array+4 # 将数组长度存储在$a1中
addi $a1, $a1, -1 # 数组长度-1
outerloop:
li $t0, 1 # 将标志位$t0设置为1
li $t1, 0 # 将$i的初值设置为0
innerloop:
add $t2, $a0, $t1 # 计算第$i个元素的地址
lw $t3, ($t2) # 将第$i个元素存储在$t3中
addi $t4, $t1, 4 # 计算下一个元素的地址
add $t5, $a0, $t4 # 计算下一个元素的地址
lw $t6, ($t5) # 将下一个元素存储在$t6中
ble $t3, $t6, skipswap # 如果$t3 <= $t6,则跳过交换
sw $t3, ($t5) # 否则,交换$t3和$t6
sw $t6, ($t2)
li $t0, 0 # 设置标志位$t0为0,表示进行了交换
skipswap:
addi $t1, $t1, 4 # 增加$i的值
blt $t1, $a1, innerloop # 如果$i < n - 1,则继续循环
beqz $t0, outerloop # 如果标志位$t0为0,则继续外部循环
# 打印排序后的数组
li $v0, 4
la $a0, newline
syscall
la $a0, array
printloop:
lw $a1, ($a0)
li $v0, 1
syscall
la $a0, newline
li $v0, 4
syscall
addi $a0, $a0, 4
blt $a0, array+20, printloop
li $v0, 10 # 退出程序
syscall
```
在上面的示例代码中,我们首先定义了一个包含一些随机数字的数组。然后,我们使用`lw`指令将数组的起始地址存储在寄存器`$a0`中,将数组长度存储在寄存器`$a1`中。接下来,我们使用两个循环来实现冒泡排序。外部循环用于控制每一轮比较和交换,内部循环用于比较和交换相邻的元素。最后,我们使用`syscall`指令将排序后的数组打印出来。